{
 "cells": [
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:04.997448Z",
     "start_time": "2024-09-23T00:38:00.910206Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 导入相关库\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from datetime import date\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import roc_auc_score"
   ],
   "id": "f9d8ab331393e317",
   "outputs": [],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:06.946142Z",
     "start_time": "2024-09-23T00:38:05.001029Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "# ------------------------------------  第一部分 读取数据  --------------------------------------#\n",
    "off_train_data = pd.read_csv('ccf_offline_stage1_train.csv',encoding='utf-8')\n",
    "off_test_data = pd.read_csv('ccf_offline_stage1_test_revised.csv',encoding='utf-8')\n",
    "# 填充缺失值\n",
    "off_train_data = off_train_data.fillna('null')\n",
    "off_test_data = off_test_data.fillna('null')"
   ],
   "id": "c385c02f838a438e",
   "outputs": [],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:08.210181Z",
     "start_time": "2024-09-23T00:38:06.946142Z"
    }
   },
   "cell_type": "code",
   "source": [
    "dups = off_train_data.duplicated().sum()\n",
    "print(dups)"
   ],
   "id": "9152fec5867d5e24",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "37893\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:08.219908Z",
     "start_time": "2024-09-23T00:38:08.211194Z"
    }
   },
   "cell_type": "code",
   "source": "off_train_data.shape[0]",
   "id": "d3d8014a5e3e9b10",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1754884"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:08.307957Z",
     "start_time": "2024-09-23T00:38:08.220926Z"
    }
   },
   "cell_type": "code",
   "source": "off_train_data.info()",
   "id": "73e1546e7fa6342",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1754884 entries, 0 to 1754883\n",
      "Data columns (total 7 columns):\n",
      " #   Column         Dtype \n",
      "---  ------         ----- \n",
      " 0   User_id        int64 \n",
      " 1   Merchant_id    int64 \n",
      " 2   Coupon_id      object\n",
      " 3   Discount_rate  object\n",
      " 4   Distance       object\n",
      " 5   Date_received  object\n",
      " 6   Date           object\n",
      "dtypes: int64(2), object(5)\n",
      "memory usage: 93.7+ MB\n"
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:42.669101Z",
     "start_time": "2024-09-23T00:38:08.307957Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "# 用label列标记分类，label的取值为1表示正样本，0表示负样本，-1表示普通用户\n",
    "def label(row):\n",
    "    if row['Date'] != 'null' and row['Date_received'] != 'null':\n",
    "        if row['Coupon_id'] != 'null':\n",
    "            # 优惠券id不为空，表示使用了优惠券购买\n",
    "            # 计算使用优惠券的日期差值\n",
    "            td = pd.to_datetime(row['Date'], format='%Y%m%d') - \\\n",
    "                 pd.to_datetime(row['Date_received'], format='%Y%m%d')\n",
    "            if td <= pd.Timedelta(15, 'D'):  # 判断使用优惠券是否在15天内\n",
    "                return 1\n",
    "            else:\n",
    "                return 0\n",
    "        else:\n",
    "            # 其他情况：优惠券id为null，表示没有使用优惠券购买\n",
    "            return 0\n",
    "    if row['Date'] == 'null' and row['Date_received'] != 'null':\n",
    "        return 0\n",
    "    else:\n",
    "        return -1\n",
    "# 标记label的值达到分类目的\n",
    "off_train_data['label'] = off_train_data.apply(label, axis = 1)\n",
    "off_train_data['label'].value_counts()\n",
    "''' \n",
    " 0    988887\n",
    "-1    701602\n",
    " 1     64395\n",
    "Name: label, dtype: int64\n",
    "'''\n",
    "off_train_data.columns\n",
    "'''\n",
    "Index(['User_id', 'Merchant_id', 'Coupon_id', 'Discount_rate', 'Distance',\n",
    "       'Date_received', 'Date', 'label'],\n",
    "      dtype='object')\n",
    "'''\n",
    "off_train_data"
   ],
   "id": "ea3d0dd3ee707c19",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "         User_id  Merchant_id Coupon_id Discount_rate Distance Date_received  \\\n",
       "0        1439408         2632      null          null      0.0          null   \n",
       "1        1439408         4663   11002.0        150:20      1.0    20160528.0   \n",
       "2        1439408         2632    8591.0          20:1      0.0    20160217.0   \n",
       "3        1439408         2632    1078.0          20:1      0.0    20160319.0   \n",
       "4        1439408         2632    8591.0          20:1      0.0    20160613.0   \n",
       "...          ...          ...       ...           ...      ...           ...   \n",
       "1754879   212662         3532      null          null      1.0          null   \n",
       "1754880   212662         3021    3739.0          30:1      6.0    20160508.0   \n",
       "1754881   212662         2934      null          null      2.0          null   \n",
       "1754882   752472         7113    1633.0         50:10      6.0    20160613.0   \n",
       "1754883   752472         3621    2705.0          20:5      0.0    20160523.0   \n",
       "\n",
       "               Date  label  \n",
       "0        20160217.0     -1  \n",
       "1              null      0  \n",
       "2              null      0  \n",
       "3              null      0  \n",
       "4              null      0  \n",
       "...             ...    ...  \n",
       "1754879  20160322.0     -1  \n",
       "1754880  20160602.0      0  \n",
       "1754881  20160321.0     -1  \n",
       "1754882        null      0  \n",
       "1754883        null      0  \n",
       "\n",
       "[1754884 rows x 8 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User_id</th>\n",
       "      <th>Merchant_id</th>\n",
       "      <th>Coupon_id</th>\n",
       "      <th>Discount_rate</th>\n",
       "      <th>Distance</th>\n",
       "      <th>Date_received</th>\n",
       "      <th>Date</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1439408</td>\n",
       "      <td>2632</td>\n",
       "      <td>null</td>\n",
       "      <td>null</td>\n",
       "      <td>0.0</td>\n",
       "      <td>null</td>\n",
       "      <td>20160217.0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1439408</td>\n",
       "      <td>4663</td>\n",
       "      <td>11002.0</td>\n",
       "      <td>150:20</td>\n",
       "      <td>1.0</td>\n",
       "      <td>20160528.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1439408</td>\n",
       "      <td>2632</td>\n",
       "      <td>8591.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20160217.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1439408</td>\n",
       "      <td>2632</td>\n",
       "      <td>1078.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20160319.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1439408</td>\n",
       "      <td>2632</td>\n",
       "      <td>8591.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20160613.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1754879</th>\n",
       "      <td>212662</td>\n",
       "      <td>3532</td>\n",
       "      <td>null</td>\n",
       "      <td>null</td>\n",
       "      <td>1.0</td>\n",
       "      <td>null</td>\n",
       "      <td>20160322.0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1754880</th>\n",
       "      <td>212662</td>\n",
       "      <td>3021</td>\n",
       "      <td>3739.0</td>\n",
       "      <td>30:1</td>\n",
       "      <td>6.0</td>\n",
       "      <td>20160508.0</td>\n",
       "      <td>20160602.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1754881</th>\n",
       "      <td>212662</td>\n",
       "      <td>2934</td>\n",
       "      <td>null</td>\n",
       "      <td>null</td>\n",
       "      <td>2.0</td>\n",
       "      <td>null</td>\n",
       "      <td>20160321.0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1754882</th>\n",
       "      <td>752472</td>\n",
       "      <td>7113</td>\n",
       "      <td>1633.0</td>\n",
       "      <td>50:10</td>\n",
       "      <td>6.0</td>\n",
       "      <td>20160613.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1754883</th>\n",
       "      <td>752472</td>\n",
       "      <td>3621</td>\n",
       "      <td>2705.0</td>\n",
       "      <td>20:5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20160523.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1754884 rows × 8 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:43.238067Z",
     "start_time": "2024-09-23T00:38:42.671124Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "# ------------------------------------  第二部分 数据取样  --------------------------------------#\n",
    "# 随机抽样，按照正负样例1：1\n",
    "# 切片\n",
    "X = off_train_data.loc[:,off_train_data.columns != 'label']  # 数据\n",
    "y = off_train_data.loc[:,off_train_data.columns == 'label']  # 标签\n",
    "# 获取类1标签的长度\n",
    "count_one_Class = len(off_train_data[off_train_data['label'] == 1])\n",
    "# 获取两类标签的索引\n",
    "one_Class_index = off_train_data[off_train_data['label'] == 1].index\n",
    "zero_Class_index = off_train_data[off_train_data['label'] == 0].index\n",
    "# 随机选择相同数目的索引\n",
    "np.random.seed(25)  # 定义随机种子\n",
    "random_zero_index = np.array(np.random.choice(zero_Class_index,count_one_Class,replace=True))\n",
    "# 正负样本 1:10\n",
    "# random_zero_index = np.array(np.random.choice(zero_Class_index,count_one_Class*10,replace=True))\n",
    "\n",
    "# 合并模型样本索引\n",
    "sample = np.concatenate([one_Class_index,random_zero_index])\n",
    "# 按照索引获取行\n",
    "off_train_data = off_train_data.loc[sample,:]\n",
    "# 打印结果对比\n",
    "print('label为1的数目：', len(one_Class_index))\n",
    "print('label为0的数目：', len(zero_Class_index))\n",
    "print('总数：', len(one_Class_index) + len(zero_Class_index))\n",
    "print('抽样label为1的数目：', len(one_Class_index))\n",
    "print('随机抽取label为0的数目：', len(random_zero_index))\n",
    "print('抽样总数：', len(one_Class_index) + len(random_zero_index))\n",
    "print('总样本形状：', off_train_data.shape)"
   ],
   "id": "208b0a0c0aa8a349",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "label为1的数目： 64395\n",
      "label为0的数目： 988887\n",
      "总数： 1053282\n",
      "抽样label为1的数目： 64395\n",
      "随机抽取label为0的数目： 64395\n",
      "抽样总数： 128790\n",
      "总样本形状： (128790, 8)\n"
     ]
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:43.452451Z",
     "start_time": "2024-09-23T00:38:43.238067Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# ------------------------------------  第三部分 数据探索  --------------------------------------#\n",
    "# 探索性分析\n",
    "off_train_data.value_counts()"
   ],
   "id": "783aadefe3fb71b5",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "User_id  Merchant_id  Coupon_id  Discount_rate  Distance  Date_received  Date        label\n",
       "5625260  5341         11539.0    30:5           0.0       20160214.0     20160214.0  1        10\n",
       "2692738  5341         11539.0    30:5           0.0       20160207.0     20160209.0  1         9\n",
       "2956333  4142         4773.0     100:10         0.0       20160219.0     20160219.0  1         8\n",
       "687544   5341         11539.0    30:5           0.0       20160128.0     20160131.0  1         6\n",
       "2692738  5341         11539.0    30:5           0.0       20160207.0     20160208.0  1         6\n",
       "                                                                                              ..\n",
       "2521107  58           10364.0    50:5           0.0       20160326.0     20160406.0  1         1\n",
       "2520969  5341         111.0      30:5           0.0       20160207.0     null        0         1\n",
       "2520933  6486         2494.0     100:10         6.0       20160119.0     null        0         1\n",
       "         6424         1315.0     100:10         null      20160119.0     null        0         1\n",
       "7360941  6485         10323.0    20:5           0.0       20160325.0     20160327.0  1         1\n",
       "Name: count, Length: 124320, dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:43.459610Z",
     "start_time": "2024-09-23T00:38:43.452451Z"
    }
   },
   "cell_type": "code",
   "source": "off_train_data.shape[0]",
   "id": "61ccdba2b004dd11",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "128790"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:43.746961Z",
     "start_time": "2024-09-23T00:38:43.461127Z"
    }
   },
   "cell_type": "code",
   "source": [
    "off_train_data.drop_duplicates(inplace=True)\n",
    "off_train_data.duplicated().sum()"
   ],
   "id": "bf0751b68dd2ab01",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:43.801458Z",
     "start_time": "2024-09-23T00:38:43.746961Z"
    }
   },
   "cell_type": "code",
   "source": "off_train_data.isnull().sum()",
   "id": "f1090377773a3fdf",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "User_id          0\n",
       "Merchant_id      0\n",
       "Coupon_id        0\n",
       "Discount_rate    0\n",
       "Distance         0\n",
       "Date_received    0\n",
       "Date             0\n",
       "label            0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 12
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:43.826670Z",
     "start_time": "2024-09-23T00:38:43.801458Z"
    }
   },
   "cell_type": "code",
   "source": "off_train_data",
   "id": "e856ec304f9a09ad",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "         User_id  Merchant_id Coupon_id Discount_rate Distance Date_received  \\\n",
       "33       1113008         1361   11166.0          20:1      0.0    20160515.0   \n",
       "38       2881376         8390    7531.0          20:5      0.0    20160321.0   \n",
       "69        114747         6901    2366.0          30:5      0.0    20160523.0   \n",
       "76        114747         5341     111.0          30:5      0.0    20160207.0   \n",
       "77        114747         5341    7751.0         50:10      0.0    20160127.0   \n",
       "...          ...          ...       ...           ...      ...           ...   \n",
       "1406393  7022032         3381   11951.0        200:20      8.0    20160129.0   \n",
       "701480   2405922         1569    5054.0        200:30      4.0    20160330.0   \n",
       "332686   2621253          450    8555.0          30:5     10.0    20160204.0   \n",
       "667768   1475575         5256   10219.0          30:5     null    20160428.0   \n",
       "101352   6135816         2709    2840.0        100:10      5.0    20160127.0   \n",
       "\n",
       "               Date  label  \n",
       "33       20160521.0      1  \n",
       "38       20160329.0      1  \n",
       "69       20160605.0      1  \n",
       "76       20160218.0      1  \n",
       "77       20160128.0      1  \n",
       "...             ...    ...  \n",
       "1406393        null      0  \n",
       "701480         null      0  \n",
       "332686         null      0  \n",
       "667768         null      0  \n",
       "101352         null      0  \n",
       "\n",
       "[124320 rows x 8 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User_id</th>\n",
       "      <th>Merchant_id</th>\n",
       "      <th>Coupon_id</th>\n",
       "      <th>Discount_rate</th>\n",
       "      <th>Distance</th>\n",
       "      <th>Date_received</th>\n",
       "      <th>Date</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>1113008</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20160515.0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>2881376</td>\n",
       "      <td>8390</td>\n",
       "      <td>7531.0</td>\n",
       "      <td>20:5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20160321.0</td>\n",
       "      <td>20160329.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69</th>\n",
       "      <td>114747</td>\n",
       "      <td>6901</td>\n",
       "      <td>2366.0</td>\n",
       "      <td>30:5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20160523.0</td>\n",
       "      <td>20160605.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>114747</td>\n",
       "      <td>5341</td>\n",
       "      <td>111.0</td>\n",
       "      <td>30:5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20160207.0</td>\n",
       "      <td>20160218.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>114747</td>\n",
       "      <td>5341</td>\n",
       "      <td>7751.0</td>\n",
       "      <td>50:10</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20160127.0</td>\n",
       "      <td>20160128.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1406393</th>\n",
       "      <td>7022032</td>\n",
       "      <td>3381</td>\n",
       "      <td>11951.0</td>\n",
       "      <td>200:20</td>\n",
       "      <td>8.0</td>\n",
       "      <td>20160129.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>701480</th>\n",
       "      <td>2405922</td>\n",
       "      <td>1569</td>\n",
       "      <td>5054.0</td>\n",
       "      <td>200:30</td>\n",
       "      <td>4.0</td>\n",
       "      <td>20160330.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>332686</th>\n",
       "      <td>2621253</td>\n",
       "      <td>450</td>\n",
       "      <td>8555.0</td>\n",
       "      <td>30:5</td>\n",
       "      <td>10.0</td>\n",
       "      <td>20160204.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>667768</th>\n",
       "      <td>1475575</td>\n",
       "      <td>5256</td>\n",
       "      <td>10219.0</td>\n",
       "      <td>30:5</td>\n",
       "      <td>null</td>\n",
       "      <td>20160428.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>101352</th>\n",
       "      <td>6135816</td>\n",
       "      <td>2709</td>\n",
       "      <td>2840.0</td>\n",
       "      <td>100:10</td>\n",
       "      <td>5.0</td>\n",
       "      <td>20160127.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>124320 rows × 8 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:43.993319Z",
     "start_time": "2024-09-23T00:38:43.826670Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 变换距离的类型，缺失值替换为-1\n",
    "off_train_data['Distance'] = off_train_data['Distance'].replace('null', -1).astype(int)\n",
    "off_test_data['Distance'] = off_test_data['Distance'].replace('null', -1).astype(int)\n",
    "print('查看缺失值结果：\\n',off_train_data.isnull().sum())\n",
    "# 描述性统计分析\n",
    "description = off_train_data.describe()\n",
    "# 依次计算极差值、变异系数、四分位数间距\n",
    "# 极差值  极差值是最大值与最小值之差，用于衡量数据的变异性。\n",
    "description.loc['range'] = description.loc['max'] - description.loc['min']\n",
    "# 变异系数是标准差与平均数的比值，通常用百分比表示，用于衡量相对变异性\n",
    "description.loc['var'] = description.loc['std'] - description.loc['mean']\n",
    "# 四分位数间距是第三四分位数（75%）与第一四分位数（25%）之差，用于描述数据中间50%的分布范围\n",
    "description.loc['dis'] = description.loc['75%'] - description.loc['25%']\n",
    "print('描述性统计结果：\\n',np.round(description, 2))  # 保留两位小数"
   ],
   "id": "b98a19ea23b6a5a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "查看缺失值结果：\n",
      " User_id          0\n",
      "Merchant_id      0\n",
      "Coupon_id        0\n",
      "Discount_rate    0\n",
      "Distance         0\n",
      "Date_received    0\n",
      "Date             0\n",
      "label            0\n",
      "dtype: int64\n",
      "描述性统计结果：\n",
      "           User_id  Merchant_id   Distance     label\n",
      "count   124320.00    124320.00  124320.00  124320.0\n",
      "mean   3698029.44      4059.61       1.86       0.5\n",
      "std    2123678.69      2473.26       3.36       0.5\n",
      "min        110.00         3.00      -1.00       0.0\n",
      "25%    1859184.00      1941.00       0.00       0.0\n",
      "50%    3699399.50      3621.00       0.00       0.0\n",
      "75%    5543647.50      6424.00       2.00       1.0\n",
      "max    7360941.00      8856.00      10.00       1.0\n",
      "range  7360831.00      8853.00      11.00       1.0\n",
      "var   -1574350.75     -1586.36       1.50       0.0\n",
      "dis    3684463.50      4483.00       2.00       1.0\n"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:44.004321Z",
     "start_time": "2024-09-23T00:38:43.993319Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# ------------------------------------  第四部分 数据预处理  --------------------------------------#\n",
    "# 属性构造\n",
    "# 定义函数处理折扣率\n",
    "def convertRate(row):\n",
    "    if row == 'null':\n",
    "        return 1.0\n",
    "    elif ':' in str(row):\n",
    "        rows = row.split(':')\n",
    "        return 1.0 - float(rows[1]) / float(rows[0])\n",
    "    else:\n",
    "        return float(row)\n",
    "# 定义函数处理折扣率类型\n",
    "def getDiscountType(row):\n",
    "    if row == -1:\n",
    "        return -1\n",
    "    elif ':' in row:\n",
    "        # 满多少减多少\n",
    "        return 1\n",
    "    else:\n",
    "        # 折扣率\n",
    "        return 0\n",
    "# 定义函数处理满减类型的折扣优惠券\n",
    "def Man_Rate(row):\n",
    "    if row == -1:\n",
    "        return 0\n",
    "    elif ':' in str(row):\n",
    "        rows = row.split(':')\n",
    "        return int(rows[0])\n",
    "    else:\n",
    "        return 0\n",
    "def Jian_Rate(row):\n",
    "    if row == -1:\n",
    "        return 0\n",
    "    elif ':' in str(row):\n",
    "        rows = row.split(':')\n",
    "        return int(rows[1])\n",
    "    else:\n",
    "        return 0\n"
   ],
   "id": "959bdc1809523ad8",
   "outputs": [],
   "execution_count": 15
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:44.792970Z",
     "start_time": "2024-09-23T00:38:44.004321Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 调用函数构建跟折扣率相关的四个特征属性\n",
    "# 处理训练集折扣率数据\n",
    "off_train_data['Dis_rate'] = off_train_data['Discount_rate'].apply(convertRate)\n",
    "# off_train_data['Dis_rate']\n",
    "off_train_data['Discount_type'] = off_train_data['Discount_rate'].apply(getDiscountType)\n",
    "# off_train_data['Discount_type']\n",
    "off_train_data['Discount_man'] = off_train_data['Discount_rate'].apply(Man_Rate)\n",
    "off_train_data['Discount_man']\n",
    "off_train_data['Discount_jian'] = off_train_data['Discount_rate'].apply(Jian_Rate)\n",
    "off_train_data['Discount_jian']\n",
    "\n",
    "# 处理测试集折扣率数据\n",
    "off_test_data['Dis_rate'] = off_test_data['Discount_rate'].apply(convertRate)\n",
    "off_test_data['Discount_type'] = off_test_data['Discount_rate'].apply(getDiscountType)\n",
    "off_test_data['Discount_man'] = off_test_data['Discount_rate'].apply(Man_Rate)\n",
    "off_test_data['Discount_jian'] = off_test_data['Discount_rate'].apply(Jian_Rate)\n",
    "off_test_data['Discount_jian'] \n",
    "# '''\n",
    "# # 保存文件，方便下次读取操作\n",
    "# off_train_data.to_csv('./final_off_train_data.csv')\n",
    "# off_test_data.to_csv('./final_off_test_data.csv')\n",
    "# # 读取保存的文件\n",
    "# off_train_data = pd.read_csv('./final_off_train_data.csv',index_col=0)\n",
    "# off_test_data = pd.read_csv('./final_off_test_data.csv',index_col=0)\n",
    "# '''\n",
    "# 根据label标签来提取正、负样本的全部数据\n",
    "data = off_train_data[off_train_data['label'] != -1]\n",
    "data = data.fillna(-1)\n",
    "data['label'].value_counts()\n"
   ],
   "id": "5427525b622e6d05",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "label\n",
       "0    62167\n",
       "1    62153\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:44.812945Z",
     "start_time": "2024-09-23T00:38:44.792970Z"
    }
   },
   "cell_type": "code",
   "source": "data",
   "id": "4f89f25385652588",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "         User_id  Merchant_id  Coupon_id Discount_rate  Distance  \\\n",
       "33       1113008         1361    11166.0          20:1         0   \n",
       "38       2881376         8390     7531.0          20:5         0   \n",
       "69        114747         6901     2366.0          30:5         0   \n",
       "76        114747         5341      111.0          30:5         0   \n",
       "77        114747         5341     7751.0         50:10         0   \n",
       "...          ...          ...        ...           ...       ...   \n",
       "1406393  7022032         3381    11951.0        200:20         8   \n",
       "701480   2405922         1569     5054.0        200:30         4   \n",
       "332686   2621253          450     8555.0          30:5        10   \n",
       "667768   1475575         5256    10219.0          30:5        -1   \n",
       "101352   6135816         2709     2840.0        100:10         5   \n",
       "\n",
       "         Date_received        Date  label  Dis_rate  Discount_type  \\\n",
       "33          20160515.0  20160521.0      1  0.950000              1   \n",
       "38          20160321.0  20160329.0      1  0.750000              1   \n",
       "69          20160523.0  20160605.0      1  0.833333              1   \n",
       "76          20160207.0  20160218.0      1  0.833333              1   \n",
       "77          20160127.0  20160128.0      1  0.800000              1   \n",
       "...                ...         ...    ...       ...            ...   \n",
       "1406393     20160129.0        null      0  0.900000              1   \n",
       "701480      20160330.0        null      0  0.850000              1   \n",
       "332686      20160204.0        null      0  0.833333              1   \n",
       "667768      20160428.0        null      0  0.833333              1   \n",
       "101352      20160127.0        null      0  0.900000              1   \n",
       "\n",
       "         Discount_man  Discount_jian  \n",
       "33                 20              1  \n",
       "38                 20              5  \n",
       "69                 30              5  \n",
       "76                 30              5  \n",
       "77                 50             10  \n",
       "...               ...            ...  \n",
       "1406393           200             20  \n",
       "701480            200             30  \n",
       "332686             30              5  \n",
       "667768             30              5  \n",
       "101352            100             10  \n",
       "\n",
       "[124320 rows x 12 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User_id</th>\n",
       "      <th>Merchant_id</th>\n",
       "      <th>Coupon_id</th>\n",
       "      <th>Discount_rate</th>\n",
       "      <th>Distance</th>\n",
       "      <th>Date_received</th>\n",
       "      <th>Date</th>\n",
       "      <th>label</th>\n",
       "      <th>Dis_rate</th>\n",
       "      <th>Discount_type</th>\n",
       "      <th>Discount_man</th>\n",
       "      <th>Discount_jian</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>1113008</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160515.0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>20</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>2881376</td>\n",
       "      <td>8390</td>\n",
       "      <td>7531.0</td>\n",
       "      <td>20:5</td>\n",
       "      <td>0</td>\n",
       "      <td>20160321.0</td>\n",
       "      <td>20160329.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>1</td>\n",
       "      <td>20</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69</th>\n",
       "      <td>114747</td>\n",
       "      <td>6901</td>\n",
       "      <td>2366.0</td>\n",
       "      <td>30:5</td>\n",
       "      <td>0</td>\n",
       "      <td>20160523.0</td>\n",
       "      <td>20160605.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>114747</td>\n",
       "      <td>5341</td>\n",
       "      <td>111.0</td>\n",
       "      <td>30:5</td>\n",
       "      <td>0</td>\n",
       "      <td>20160207.0</td>\n",
       "      <td>20160218.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>114747</td>\n",
       "      <td>5341</td>\n",
       "      <td>7751.0</td>\n",
       "      <td>50:10</td>\n",
       "      <td>0</td>\n",
       "      <td>20160127.0</td>\n",
       "      <td>20160128.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.800000</td>\n",
       "      <td>1</td>\n",
       "      <td>50</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1406393</th>\n",
       "      <td>7022032</td>\n",
       "      <td>3381</td>\n",
       "      <td>11951.0</td>\n",
       "      <td>200:20</td>\n",
       "      <td>8</td>\n",
       "      <td>20160129.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>200</td>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>701480</th>\n",
       "      <td>2405922</td>\n",
       "      <td>1569</td>\n",
       "      <td>5054.0</td>\n",
       "      <td>200:30</td>\n",
       "      <td>4</td>\n",
       "      <td>20160330.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.850000</td>\n",
       "      <td>1</td>\n",
       "      <td>200</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>332686</th>\n",
       "      <td>2621253</td>\n",
       "      <td>450</td>\n",
       "      <td>8555.0</td>\n",
       "      <td>30:5</td>\n",
       "      <td>10</td>\n",
       "      <td>20160204.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>667768</th>\n",
       "      <td>1475575</td>\n",
       "      <td>5256</td>\n",
       "      <td>10219.0</td>\n",
       "      <td>30:5</td>\n",
       "      <td>-1</td>\n",
       "      <td>20160428.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>101352</th>\n",
       "      <td>6135816</td>\n",
       "      <td>2709</td>\n",
       "      <td>2840.0</td>\n",
       "      <td>100:10</td>\n",
       "      <td>5</td>\n",
       "      <td>20160127.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>100</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>124320 rows × 12 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:45.692311Z",
     "start_time": "2024-09-23T00:38:44.812945Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 获取领券日期是星期几，并且构建成特征\n",
    "def getWeekday(row):\n",
    "    if row == 'null':\n",
    "        return row\n",
    "    else:\n",
    "        # 星期一是0，星期二是1，依此类推，直到星期日是6。  所以要 +1\n",
    "        return date(int(row[0:4]),int(row[4:6]),int(row[6:8])).weekday()+1\n",
    " \n",
    "data['Weekday'] = data['Date_received'].astype(str).apply(getWeekday)\n",
    "off_test_data['Weekday'] = off_test_data['Date_received'].astype(str).apply(getWeekday)\n",
    "# 周六日为类型1，其他为0\n",
    "data['Is_weekend'] = data['Weekday'].apply(lambda x: 1 if x in [6,7] else 0)\n",
    "off_test_data['Is_weekend'] = off_test_data['Weekday'].apply(lambda x: 1 if x in [6,7] else 0)\n",
    "data['Is_weekend']"
   ],
   "id": "83199d7ef9f23171",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "33         1\n",
       "38         0\n",
       "69         0\n",
       "76         1\n",
       "77         0\n",
       "          ..\n",
       "1406393    0\n",
       "701480     0\n",
       "332686     0\n",
       "667768     0\n",
       "101352     0\n",
       "Name: Is_weekend, Length: 124320, dtype: int64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:45.742112Z",
     "start_time": "2024-09-23T00:38:45.693831Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 跟星期相关的独热编码\n",
    "def One_hot(df):\n",
    "    weekdaycols = ['weekday' + str(i) for i in range(1,8)]\n",
    "    # 将分类变量（categorical variable）转换为哑变量（dummy variable）或指示变量（indicator variable）。它将每个唯一的类别值转换为一个列，列中的值要么是0，要么是1，其中1表示该行属于该类别。\n",
    "    tmpdf = pd.get_dummies(df['Weekday'].replace('null', np.nan))\n",
    "    # 将星期几bool类型的值转为数值类型\n",
    "    tmpdf = tmpdf.astype(int)\n",
    "    tmpdf.columns = weekdaycols\n",
    "    df[weekdaycols] = tmpdf\n",
    "    return df\n",
    "data = One_hot(data)\n",
    "data\n",
    "off_test_data = One_hot(off_test_data)\n",
    "off_test_data\n"
   ],
   "id": "ab14e9c627d0b46b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "        User_id  Merchant_id  Coupon_id Discount_rate  Distance  \\\n",
       "0       4129537          450       9983          30:5         1   \n",
       "1       6949378         1300       3429          30:5        -1   \n",
       "2       2166529         7113       6928        200:20         5   \n",
       "3       2166529         7113       1808        100:10         5   \n",
       "4       6172162         7605       6500          30:1         2   \n",
       "...         ...          ...        ...           ...       ...   \n",
       "113635  5828093         5717      10418          30:5        10   \n",
       "113636  6626813         1699       7595          30:1        -1   \n",
       "113637  6626813         7321       7590          50:5        -1   \n",
       "113638  4547069          760      13602          30:5         0   \n",
       "113639  6675965         7487        613          20:1         5   \n",
       "\n",
       "        Date_received  Dis_rate  Discount_type  Discount_man  Discount_jian  \\\n",
       "0            20160712  0.833333              1            30              5   \n",
       "1            20160706  0.833333              1            30              5   \n",
       "2            20160727  0.900000              1           200             20   \n",
       "3            20160727  0.900000              1           100             10   \n",
       "4            20160708  0.966667              1            30              1   \n",
       "...               ...       ...            ...           ...            ...   \n",
       "113635       20160716  0.833333              1            30              5   \n",
       "113636       20160707  0.966667              1            30              1   \n",
       "113637       20160712  0.900000              1            50              5   \n",
       "113638       20160717  0.833333              1            30              5   \n",
       "113639       20160728  0.950000              1            20              1   \n",
       "\n",
       "        Weekday  Is_weekend  weekday1  weekday2  weekday3  weekday4  weekday5  \\\n",
       "0             2           0         0         1         0         0         0   \n",
       "1             3           0         0         0         1         0         0   \n",
       "2             3           0         0         0         1         0         0   \n",
       "3             3           0         0         0         1         0         0   \n",
       "4             5           0         0         0         0         0         1   \n",
       "...         ...         ...       ...       ...       ...       ...       ...   \n",
       "113635        6           1         0         0         0         0         0   \n",
       "113636        4           0         0         0         0         1         0   \n",
       "113637        2           0         0         1         0         0         0   \n",
       "113638        7           1         0         0         0         0         0   \n",
       "113639        4           0         0         0         0         1         0   \n",
       "\n",
       "        weekday6  weekday7  \n",
       "0              0         0  \n",
       "1              0         0  \n",
       "2              0         0  \n",
       "3              0         0  \n",
       "4              0         0  \n",
       "...          ...       ...  \n",
       "113635         1         0  \n",
       "113636         0         0  \n",
       "113637         0         0  \n",
       "113638         0         1  \n",
       "113639         0         0  \n",
       "\n",
       "[113640 rows x 19 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User_id</th>\n",
       "      <th>Merchant_id</th>\n",
       "      <th>Coupon_id</th>\n",
       "      <th>Discount_rate</th>\n",
       "      <th>Distance</th>\n",
       "      <th>Date_received</th>\n",
       "      <th>Dis_rate</th>\n",
       "      <th>Discount_type</th>\n",
       "      <th>Discount_man</th>\n",
       "      <th>Discount_jian</th>\n",
       "      <th>Weekday</th>\n",
       "      <th>Is_weekend</th>\n",
       "      <th>weekday1</th>\n",
       "      <th>weekday2</th>\n",
       "      <th>weekday3</th>\n",
       "      <th>weekday4</th>\n",
       "      <th>weekday5</th>\n",
       "      <th>weekday6</th>\n",
       "      <th>weekday7</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4129537</td>\n",
       "      <td>450</td>\n",
       "      <td>9983</td>\n",
       "      <td>30:5</td>\n",
       "      <td>1</td>\n",
       "      <td>20160712</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6949378</td>\n",
       "      <td>1300</td>\n",
       "      <td>3429</td>\n",
       "      <td>30:5</td>\n",
       "      <td>-1</td>\n",
       "      <td>20160706</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2166529</td>\n",
       "      <td>7113</td>\n",
       "      <td>6928</td>\n",
       "      <td>200:20</td>\n",
       "      <td>5</td>\n",
       "      <td>20160727</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>200</td>\n",
       "      <td>20</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2166529</td>\n",
       "      <td>7113</td>\n",
       "      <td>1808</td>\n",
       "      <td>100:10</td>\n",
       "      <td>5</td>\n",
       "      <td>20160727</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>100</td>\n",
       "      <td>10</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6172162</td>\n",
       "      <td>7605</td>\n",
       "      <td>6500</td>\n",
       "      <td>30:1</td>\n",
       "      <td>2</td>\n",
       "      <td>20160708</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113635</th>\n",
       "      <td>5828093</td>\n",
       "      <td>5717</td>\n",
       "      <td>10418</td>\n",
       "      <td>30:5</td>\n",
       "      <td>10</td>\n",
       "      <td>20160716</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113636</th>\n",
       "      <td>6626813</td>\n",
       "      <td>1699</td>\n",
       "      <td>7595</td>\n",
       "      <td>30:1</td>\n",
       "      <td>-1</td>\n",
       "      <td>20160707</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113637</th>\n",
       "      <td>6626813</td>\n",
       "      <td>7321</td>\n",
       "      <td>7590</td>\n",
       "      <td>50:5</td>\n",
       "      <td>-1</td>\n",
       "      <td>20160712</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>50</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113638</th>\n",
       "      <td>4547069</td>\n",
       "      <td>760</td>\n",
       "      <td>13602</td>\n",
       "      <td>30:5</td>\n",
       "      <td>0</td>\n",
       "      <td>20160717</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113639</th>\n",
       "      <td>6675965</td>\n",
       "      <td>7487</td>\n",
       "      <td>613</td>\n",
       "      <td>20:1</td>\n",
       "      <td>5</td>\n",
       "      <td>20160728</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>20</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>113640 rows × 19 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:46.324230Z",
     "start_time": "2024-09-23T00:38:45.744652Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 定义函数得到另外相关的三个特征属性\n",
    "def func(data):\n",
    "    # 提取用户使用的优惠券的数量\n",
    "    f = data[['User_id', 'Coupon_id']]\n",
    "    f['rec_coupon'] = 1\n",
    "    f = f.groupby(['User_id']).agg('sum').reset_index()\n",
    " \n",
    "    # 全部优惠券的数目\n",
    "    f1 = data[['Coupon_id']]\n",
    "    l1 = len(f1)\n",
    "    f1['Number_coupon'] = 1\n",
    "    f1 = f1.groupby(['Coupon_id']).agg('sum').reset_index()\n",
    "    # 优惠券的流行度：每一种优惠券占全部优惠券的比例\n",
    "    f1['Coupon_popu'] = f1['Number_coupon']/l1\n",
    " \n",
    "    # 提取用户和商家\n",
    "    f2 = data[['User_id','Merchant_id']]\n",
    "    l2 = len(f2)\n",
    "    # 提取顾客去商家的数量\n",
    "    f2['Number_merchant'] = 1\n",
    "    f2 = f2.groupby(['Merchant_id']).agg('sum').reset_index()\n",
    "    # 商家的受欢迎度：商家的顾客（用户）占全部商家的顾客（用户）的比例\n",
    "    f2['Merchant_popu'] = f2['Number_merchant']/l2\n",
    " \n",
    "    # 合并特征属性\n",
    "    d0 = pd.merge(data, f[['User_id','rec_coupon']], on='User_id')\n",
    "    d1 = pd.merge(d0,f1[['Coupon_id','Coupon_popu']],on='Coupon_id')\n",
    "    d2 = pd.merge(d1,f2[['Merchant_id','Merchant_popu']],on=['Merchant_id'])\n",
    "    return d2\n",
    "# 调用以上函数构建相关的三个特征属性\n",
    "new_data = func(data)\n",
    "new_test_data = func(off_test_data)\n",
    "new_data"
   ],
   "id": "93ce4f799b49b7c2",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_16752\\2871514971.py:5: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  f['rec_coupon'] = 1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_16752\\2871514971.py:11: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  f1['Number_coupon'] = 1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_16752\\2871514971.py:20: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  f2['Number_merchant'] = 1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_16752\\2871514971.py:5: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  f['rec_coupon'] = 1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_16752\\2871514971.py:11: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  f1['Number_coupon'] = 1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_16752\\2871514971.py:20: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  f2['Number_merchant'] = 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "        User_id  Merchant_id  Coupon_id Discount_rate  Distance  \\\n",
       "0       1113008         1361    11166.0          20:1         0   \n",
       "1       1449506         1361    11166.0          20:1         1   \n",
       "2       1449506         1361    11166.0          20:1         1   \n",
       "3       4781321         1361    11166.0          20:1         0   \n",
       "4       4781321         1361    11166.0          20:1         0   \n",
       "...         ...          ...        ...           ...       ...   \n",
       "124315  5389427         1184     1857.0        150:20         0   \n",
       "124316     6896         2511      869.0          50:5         0   \n",
       "124317  6598279         2846    11348.0        100:30         2   \n",
       "124318   287650         2123     1453.0          20:1        -1   \n",
       "124319   490662         5176     3923.0          20:5         7   \n",
       "\n",
       "        Date_received        Date  label  Dis_rate  Discount_type  ...  \\\n",
       "0          20160515.0  20160521.0      1  0.950000              1  ...   \n",
       "1          20160516.0  20160522.0      1  0.950000              1  ...   \n",
       "2          20160522.0  20160602.0      1  0.950000              1  ...   \n",
       "3          20160516.0  20160521.0      1  0.950000              1  ...   \n",
       "4          20160521.0  20160524.0      1  0.950000              1  ...   \n",
       "...               ...         ...    ...       ...            ...  ...   \n",
       "124315     20160521.0        null      0  0.866667              1  ...   \n",
       "124316     20160504.0        null      0  0.900000              1  ...   \n",
       "124317     20160522.0        null      0  0.700000              1  ...   \n",
       "124318     20160509.0        null      0  0.950000              1  ...   \n",
       "124319     20160418.0        null      0  0.750000              1  ...   \n",
       "\n",
       "        weekday1  weekday2  weekday3  weekday4  weekday5  weekday6  weekday7  \\\n",
       "0              0         0         0         0         0         0         1   \n",
       "1              1         0         0         0         0         0         0   \n",
       "2              0         0         0         0         0         0         1   \n",
       "3              1         0         0         0         0         0         0   \n",
       "4              0         0         0         0         0         1         0   \n",
       "...          ...       ...       ...       ...       ...       ...       ...   \n",
       "124315         0         0         0         0         0         1         0   \n",
       "124316         0         0         1         0         0         0         0   \n",
       "124317         0         0         0         0         0         0         1   \n",
       "124318         1         0         0         0         0         0         0   \n",
       "124319         1         0         0         0         0         0         0   \n",
       "\n",
       "        rec_coupon  Coupon_popu  Merchant_popu  \n",
       "0                1     0.000088       0.000088  \n",
       "1                2     0.000088       0.000088  \n",
       "2                2     0.000088       0.000088  \n",
       "3                3     0.000088       0.000088  \n",
       "4                3     0.000088       0.000088  \n",
       "...            ...          ...            ...  \n",
       "124315           1     0.000008       0.000008  \n",
       "124316           1     0.000008       0.000008  \n",
       "124317           1     0.000008       0.000008  \n",
       "124318           1     0.000008       0.000008  \n",
       "124319           1     0.000008       0.000008  \n",
       "\n",
       "[124320 rows x 24 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User_id</th>\n",
       "      <th>Merchant_id</th>\n",
       "      <th>Coupon_id</th>\n",
       "      <th>Discount_rate</th>\n",
       "      <th>Distance</th>\n",
       "      <th>Date_received</th>\n",
       "      <th>Date</th>\n",
       "      <th>label</th>\n",
       "      <th>Dis_rate</th>\n",
       "      <th>Discount_type</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday1</th>\n",
       "      <th>weekday2</th>\n",
       "      <th>weekday3</th>\n",
       "      <th>weekday4</th>\n",
       "      <th>weekday5</th>\n",
       "      <th>weekday6</th>\n",
       "      <th>weekday7</th>\n",
       "      <th>rec_coupon</th>\n",
       "      <th>Coupon_popu</th>\n",
       "      <th>Merchant_popu</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1113008</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160515.0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1449506</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>1</td>\n",
       "      <td>20160516.0</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1449506</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>1</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>20160602.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4781321</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160516.0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4781321</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>20160524.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124315</th>\n",
       "      <td>5389427</td>\n",
       "      <td>1184</td>\n",
       "      <td>1857.0</td>\n",
       "      <td>150:20</td>\n",
       "      <td>0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.866667</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124316</th>\n",
       "      <td>6896</td>\n",
       "      <td>2511</td>\n",
       "      <td>869.0</td>\n",
       "      <td>50:5</td>\n",
       "      <td>0</td>\n",
       "      <td>20160504.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124317</th>\n",
       "      <td>6598279</td>\n",
       "      <td>2846</td>\n",
       "      <td>11348.0</td>\n",
       "      <td>100:30</td>\n",
       "      <td>2</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.700000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124318</th>\n",
       "      <td>287650</td>\n",
       "      <td>2123</td>\n",
       "      <td>1453.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>-1</td>\n",
       "      <td>20160509.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124319</th>\n",
       "      <td>490662</td>\n",
       "      <td>5176</td>\n",
       "      <td>3923.0</td>\n",
       "      <td>20:5</td>\n",
       "      <td>7</td>\n",
       "      <td>20160418.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>124320 rows × 24 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:46.686077Z",
     "start_time": "2024-09-23T00:38:46.324230Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 定义函数得到跟距离相关的特征属性\n",
    "def Get_mer_dis(new_data):\n",
    "    # 查看距离的类别数量\n",
    "    new_data['Distance'].value_counts()\n",
    "    # 提取用户-商家距离的数据集\n",
    "    md1 = new_data[new_data.Coupon_id != 'null'][['Merchant_id', 'Distance']]\n",
    "    md1.replace('null', -1, inplace=True)\n",
    "    md1.replace(-1, np.nan, inplace=True)\n",
    "    # 用户-商家的距离最小值\n",
    "    md2 = md1.groupby('Merchant_id').agg('min').reset_index()\n",
    "    md2.rename(columns={'Distance': 'merchant_min_distance'}, inplace=True)\n",
    "    # 用户-商家的距离最大值\n",
    "    md3 = md1.groupby('Merchant_id').agg('max').reset_index()\n",
    "    md3.rename(columns={'Distance': 'merchant_max_distance'}, inplace=True)\n",
    "    # 用户-商品的距离平均值\n",
    "    md4 = md1.groupby('Merchant_id').agg('mean').reset_index()\n",
    "    md4.rename(columns={'Distance': 'merchant_mean_distance'}, inplace=True)\n",
    "    # 用户-离商品的距离中位值\n",
    "    md5 = md1.groupby('Merchant_id').agg('median').reset_index()\n",
    "    md5.rename(columns={'Distance': 'merchant_median_distance'}, inplace=True)\n",
    "    # 将所有特征合并在一起\n",
    "    merchant_feature = pd.merge(md2, md3, on='Merchant_id', how='left')\n",
    "    merchant_feature = pd.merge(merchant_feature, md4, on='Merchant_id', how='left')\n",
    "    merchant_feature = pd.merge(merchant_feature, md5, on='Merchant_id', how='left')\n",
    "    new_data = pd.merge(new_data,merchant_feature,on='Merchant_id',how='left')\n",
    "    return new_data\n",
    "# 调用上边函数构建距离相关的特征属性\n",
    "new_data = Get_mer_dis(new_data)\n",
    "new_test_data = Get_mer_dis(new_test_data)\n",
    "new_data"
   ],
   "id": "a23ca7716597b546",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "        User_id  Merchant_id  Coupon_id Discount_rate  Distance  \\\n",
       "0       1113008         1361    11166.0          20:1         0   \n",
       "1       1449506         1361    11166.0          20:1         1   \n",
       "2       1449506         1361    11166.0          20:1         1   \n",
       "3       4781321         1361    11166.0          20:1         0   \n",
       "4       4781321         1361    11166.0          20:1         0   \n",
       "...         ...          ...        ...           ...       ...   \n",
       "124315  5389427         1184     1857.0        150:20         0   \n",
       "124316     6896         2511      869.0          50:5         0   \n",
       "124317  6598279         2846    11348.0        100:30         2   \n",
       "124318   287650         2123     1453.0          20:1        -1   \n",
       "124319   490662         5176     3923.0          20:5         7   \n",
       "\n",
       "        Date_received        Date  label  Dis_rate  Discount_type  ...  \\\n",
       "0          20160515.0  20160521.0      1  0.950000              1  ...   \n",
       "1          20160516.0  20160522.0      1  0.950000              1  ...   \n",
       "2          20160522.0  20160602.0      1  0.950000              1  ...   \n",
       "3          20160516.0  20160521.0      1  0.950000              1  ...   \n",
       "4          20160521.0  20160524.0      1  0.950000              1  ...   \n",
       "...               ...         ...    ...       ...            ...  ...   \n",
       "124315     20160521.0        null      0  0.866667              1  ...   \n",
       "124316     20160504.0        null      0  0.900000              1  ...   \n",
       "124317     20160522.0        null      0  0.700000              1  ...   \n",
       "124318     20160509.0        null      0  0.950000              1  ...   \n",
       "124319     20160418.0        null      0  0.750000              1  ...   \n",
       "\n",
       "        weekday5  weekday6  weekday7  rec_coupon  Coupon_popu  Merchant_popu  \\\n",
       "0              0         0         1           1     0.000088       0.000088   \n",
       "1              0         0         0           2     0.000088       0.000088   \n",
       "2              0         0         1           2     0.000088       0.000088   \n",
       "3              0         0         0           3     0.000088       0.000088   \n",
       "4              0         1         0           3     0.000088       0.000088   \n",
       "...          ...       ...       ...         ...          ...            ...   \n",
       "124315         0         1         0           1     0.000008       0.000008   \n",
       "124316         0         0         0           1     0.000008       0.000008   \n",
       "124317         0         0         1           1     0.000008       0.000008   \n",
       "124318         0         0         0           1     0.000008       0.000008   \n",
       "124319         0         0         0           1     0.000008       0.000008   \n",
       "\n",
       "        merchant_min_distance  merchant_max_distance  merchant_mean_distance  \\\n",
       "0                         0.0                    1.0                     0.2   \n",
       "1                         0.0                    1.0                     0.2   \n",
       "2                         0.0                    1.0                     0.2   \n",
       "3                         0.0                    1.0                     0.2   \n",
       "4                         0.0                    1.0                     0.2   \n",
       "...                       ...                    ...                     ...   \n",
       "124315                    0.0                    0.0                     0.0   \n",
       "124316                    0.0                    0.0                     0.0   \n",
       "124317                    2.0                    2.0                     2.0   \n",
       "124318                    NaN                    NaN                     NaN   \n",
       "124319                    7.0                    7.0                     7.0   \n",
       "\n",
       "        merchant_median_distance  \n",
       "0                            0.0  \n",
       "1                            0.0  \n",
       "2                            0.0  \n",
       "3                            0.0  \n",
       "4                            0.0  \n",
       "...                          ...  \n",
       "124315                       0.0  \n",
       "124316                       0.0  \n",
       "124317                       2.0  \n",
       "124318                       NaN  \n",
       "124319                       7.0  \n",
       "\n",
       "[124320 rows x 28 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User_id</th>\n",
       "      <th>Merchant_id</th>\n",
       "      <th>Coupon_id</th>\n",
       "      <th>Discount_rate</th>\n",
       "      <th>Distance</th>\n",
       "      <th>Date_received</th>\n",
       "      <th>Date</th>\n",
       "      <th>label</th>\n",
       "      <th>Dis_rate</th>\n",
       "      <th>Discount_type</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday5</th>\n",
       "      <th>weekday6</th>\n",
       "      <th>weekday7</th>\n",
       "      <th>rec_coupon</th>\n",
       "      <th>Coupon_popu</th>\n",
       "      <th>Merchant_popu</th>\n",
       "      <th>merchant_min_distance</th>\n",
       "      <th>merchant_max_distance</th>\n",
       "      <th>merchant_mean_distance</th>\n",
       "      <th>merchant_median_distance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1113008</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160515.0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1449506</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>1</td>\n",
       "      <td>20160516.0</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1449506</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>1</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>20160602.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4781321</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160516.0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4781321</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>20160524.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124315</th>\n",
       "      <td>5389427</td>\n",
       "      <td>1184</td>\n",
       "      <td>1857.0</td>\n",
       "      <td>150:20</td>\n",
       "      <td>0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.866667</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124316</th>\n",
       "      <td>6896</td>\n",
       "      <td>2511</td>\n",
       "      <td>869.0</td>\n",
       "      <td>50:5</td>\n",
       "      <td>0</td>\n",
       "      <td>20160504.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124317</th>\n",
       "      <td>6598279</td>\n",
       "      <td>2846</td>\n",
       "      <td>11348.0</td>\n",
       "      <td>100:30</td>\n",
       "      <td>2</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.700000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124318</th>\n",
       "      <td>287650</td>\n",
       "      <td>2123</td>\n",
       "      <td>1453.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>-1</td>\n",
       "      <td>20160509.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124319</th>\n",
       "      <td>490662</td>\n",
       "      <td>5176</td>\n",
       "      <td>3923.0</td>\n",
       "      <td>20:5</td>\n",
       "      <td>7</td>\n",
       "      <td>20160418.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>124320 rows × 28 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:46.696321Z",
     "start_time": "2024-09-23T00:38:46.687060Z"
    }
   },
   "cell_type": "code",
   "source": "new_data.dtypes",
   "id": "3aa754ac369f1fa0",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "User_id                       int64\n",
       "Merchant_id                   int64\n",
       "Coupon_id                   float64\n",
       "Discount_rate                object\n",
       "Distance                      int32\n",
       "Date_received               float64\n",
       "Date                         object\n",
       "label                         int64\n",
       "Dis_rate                    float64\n",
       "Discount_type                 int64\n",
       "Discount_man                  int64\n",
       "Discount_jian                 int64\n",
       "Weekday                       int64\n",
       "Is_weekend                    int64\n",
       "weekday1                      int32\n",
       "weekday2                      int32\n",
       "weekday3                      int32\n",
       "weekday4                      int32\n",
       "weekday5                      int32\n",
       "weekday6                      int32\n",
       "weekday7                      int32\n",
       "rec_coupon                    int64\n",
       "Coupon_popu                 float64\n",
       "Merchant_popu               float64\n",
       "merchant_min_distance       float64\n",
       "merchant_max_distance       float64\n",
       "merchant_mean_distance      float64\n",
       "merchant_median_distance    float64\n",
       "dtype: object"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:46.701932Z",
     "start_time": "2024-09-23T00:38:46.696321Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "id": "11d366cdebbb18df",
   "outputs": [],
   "execution_count": 22
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:49.226960Z",
     "start_time": "2024-09-23T00:38:46.701932Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif'] = 'SimHei'\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "# 距离柱状图\n",
    "x = np.arange(-1,11)\n",
    "dis1 = np.array(new_data['Distance'].value_counts().sort_index())\n",
    "dis2 = np.array(new_test_data['Distance'].value_counts().sort_index())\n",
    "plt.bar(x,dis1,tick_label=x, label='off_train_data', width=0.3)\n",
    "plt.bar(x+0.3,dis2,label='off_test_data',width=0.3)\n",
    "plt.xlabel('距离')\n",
    "plt.ylabel('计数')\n",
    "plt.title('距离计数分布情况')\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "id": "44389d82736e5e28",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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pk2bpmnTpql///56+umndfPNN8tisZSbHwUYGUUIMLCwsDCXgpGXl6cTJ04oOjpa0sW9HJdewK+oqMjlTKOnnnqq3AUDS0tL5XA4KpxfJF28PtHP95a4q6CgoNxept69ezv/vmHDBplMJr300ks6c+aMdu7cWWE5KztVPjw8XNLFzyEiIsJlj09BQYHOnz+v5s2bu7z28OHDGj16tEJDQ7V48WLNnDlT9evXV7NmzSRJkZGRMpvNzsfST2fkVScgoOpLvVV01t+8efNkMpk0cOBASRcvd3D69Gnn2WUAXFGEADhNmTLFuadgzpw5zr0al/rNb37j/HtgYKB++9vfatKkSZIunsE1bdo0rVu3To0aNZLD4dAHH3ygW265RdLFQ2DVXdjwL3/5i+69995ye4YqctVVV+nLL7/U4cOHdc8992jt2rVq2rSpXn/9dX3xxRfOvShdu3bVwoUL9cUXX2jMmDHVrnfDhg3OCcllfvjhB0kqV4SuueYaPf300/rf//1fRUVFVbvu2ig7VDZkyJByc5YqOqyVm5urt99+W9OmTXPOHdqzZ49KSkrUsWPHOs0GXCkoQgAqVd0hlEv3WOzbt0+TJ0/WM88847woYl5eniZNmiS73a7hw4dXu7309HStWLFCCQkJNSpCJpNJDRs21JQpU9S4cWNt27ZN0dHRWrp0qaZPn+5c7ne/+50effRRdezYscrr+kjS1q1btWXLFs2fP9/l+WPHjkmSy56dMpe+t5/PoapIbScpf/TRRxUeGruUw+HQlClTFB0drREjRjifX7Jkibp3764mTZqUW2/Z5RMq2rMEGAVf/QAkXfxBumXLFm3btq3cPJqaGDdunEpLS/Xf//5XTz31lI4dO6ajR4+qpKRE6enpzkM1FSkqKtKhQ4e0evVqvfXWW4qJianVtidNmqQtW7boiy++0KRJk2QymfTvf/9bnTt3VtOmTZ2To8PCwnT+/HmFhYVVuJ4dO3boj3/8owYMGFDuStTfffedIiIiKrw44aWqmoC8Zs0affXVVzp58mS5K2hXZfDgweWe+/nZe2+//bb+/e9/691333XuPVq9erU++ugjLVq0qML1/ve//9Xvfvc7/e1vf3MeHgSMhiIEGFReXp4yMzP13//+Vz179lRAQID27t2r6OhotWzZUna7XUePHi13w1KHw+E81HLp3g+LxaLs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LEvbt2/X4MGDq82yYcMGLV68WK+++qrS09O1du1a51h2drbS09M1Y8YMrVu3TqdPn9bSpUur3V52drbS0tL0wgsvlHudL3BoDACAanz22WeqX7++Hn30UUnSs88+q169eumbb75Rt27dFBISoqCgIEVERDhfExQUpKCgoArHqhIaGqrQ0FAFBgYqNDRUV111lfPO6p999pmCgoL0yCOPyGQyacyYMXr66aclSWazWYGBgbLZbGrcuLFee+01520wwsPDnesPDw+vcZZPP/1Ut9xyi+Lj4yVJt912m3Oyd5s2bbR+/XpFREQoKytLDodD3333XbXba9OmjTZt2qSgoCDt3bvX5XW+QBECAKAaR48edZnwGxwcrKZNm+ro0aPq1q2b13IcO3ZMp0+fdhaT0tJSFRYWqri4WKGhoXrllVc0f/58TZs2zblHqXXr1m5v7/jx4+rVq5fz8bXXXussQkVFRUpLS9POnTvVqVMnmc1mlZaWVrvOoqIiPfvss9q+fXutXucpFCEAAKrRokUL5eXlOR8XFxfr+PHjatGihce2aTKZyt3YtFmzZurSpYtmz54t6eKNT61WqwIDA3XmzBlFRERo+fLlOnfunKZMmaIXXnhB8+fPr3KdVWncuLGOHz/ufHz06FHn399++22dOXNGmzZtUkhIiGbNmqXTp09X+x7efvttnT59Wps3b1ZwcHCFr/Mm5ggBAPxDkw5S81jP/2nSodbREhISVFhYqLlz5+rw4cOaPn262rRpo5iYGA98EBe1bt1aW7du1YkTJ7RlyxbZ7XYlJCToyJEj2rt3r8xmsz788EM99NBDcjgcOnPmjMaMGaONGzfKarUqICCg3J6W1q1b6/PPP9exY8ecc3iqMmjQIK1du1Y7d+7Unj17tGLFCufYuXPnnNtdu3atli1bVq70VLS9c+fOSVKVr/Mm9ggBAHyv1F7n1/apdnsB5hovXr9+fS1cuFBTpkzRokWLFBcXp3nz5ikgwHP7E8aPH6/k5GTdcsstat68uTIzMxUREaF58+YpLS1NEydOVLt27fTaa68pMDBQbdu21YQJEzR16lSdPHlSHTt21PTp013WOXXqVE2ePFmzZs3SjTfe6DzEVpnBgwcrOztb48ePV4MGDTRo0CAdPHhQknTfffdpx44d+s1vfqNu3brptttu07Zt26rd3n333aedO3dqyJAhlb7Om0wOX9awy4Ddbtfu3bvVrVs3mc01/5/mctleVW76yxf6+sjZapfr3CJCmY/180KiyvnT5/ZzZHOPv2bz11zS5ZGtY8eO+v7773Xdddc5JwD7msPh0Llz51SvXj2ZTCZfx3FBtqoVFRXpwIEDFX491fT/B/YIAQDgZT169Kjw+TZt2tToFPu6smPHDiUlJVU4NmrUKOdp+1cyihAAAF6WkZFR4fNBQUFezRETE1Nplvr163s1i69QhAAA8DJ/ufdWSEiI32TxFc4aAwB4HdNTURfq4uuIIgQA8JqyQz9lp1ADv0TZ19EvOaTIoTEAgNeYzWY1aNDAeZE+fzgbyuFwqLi4WAEBAT7P8nNkq3zb586d0/Hjx9WgQYNfdJYkRQgA4FXNmjWTJJcrFvuSw+HQhQsXFBQU5Jdlg2yVa9CggfPryV0UIQCAV5lMJjVv3lxNmzbVhQsXfB1Hdrtd+/btU7t27fzy+ktkq1hQUFCdbJciBADwCbPZ7Bc/3O12u6SLd333hzyXIpvnMVkaAAAYFkUIAAAYFkUIAAAYFkUIAAAYFkUIAAAYFkUIAAAYFkUIAAAYFkUIAAAYFkUIAAAYlk+KUFpamiwWi/PPjTfeKEnKycnRqFGjFB8fr/T0dDkcDudrPDEGAACMzSdF6Ouvv9aCBQu0fft2bd++XWvWrJHNZlNSUpI6d+6sVatWKTc3V6tXr5Ykj4wBAAB4vQiVlJQoJydHPXr0UEREhCIiIhQeHq6NGzfKarUqNTVVrVq1UnJyslauXClJHhkDAADw+k1Xs7Oz5XA4NHz4cB07dkzx8fFKS0vTvn37FBsbq7CwMEmSxWJRbm6uJHlkrLbKbi7naWXb8db2KuPODfR8mdlfPreKkM09/prNX3NJZHMX2dzjz9mkmufyehHKzc1V+/bt9eyzz6phw4aaPn26Jk+erHbt2qlly5bO5UwmkwICApSfny+r1VrnY5GRkbXKnZWV9Qvede15e3uXCgsLU3R0dK1fl52drfPnz3sgUc358nOrDtnc46/Z/DWXRDZ3kc09/pytJrxehIYNG6Zhw4Y5H//pT39SYmKi2rZtq+DgYJdlQ0JCVFRUJLPZXOdjtS1CMTExbu0lqS273a6srCyvba8uWSwWn23bnz83srnHX7P5ay6JbO4im3v8OZv0U77qeL0I/VxERIRKS0vVpEkT7d+/32WssLBQQUFBioyMrPOx2jKbzV79h/b29uqCP+T158+NbO7x12z+mksim7vI5h5/zlYTXp8s/cILL+jDDz90Ps7KylJAQIAsFov27NnjfD4vL082m02RkZGKiYmp8zEAAACvF6FOnTppzpw52r59u7Zu3aq0tDSNGDFCffr0UUFBgTIyMiRJCxYsUO/evWU2mxUfH1/nYwAAAF4/NDZ8+HDl5uZq/Pjxql+/vhITE5WcnKzAwEClpaUpJSVFs2bNkt1u15IlSy6G9MAYAACAT+YIpaSkKCUlpdzziYmJWr9+vbKyshQXF6dGjRp5dAwAABibzydL/1xUVJSioqK8NgYAAIyLm64CAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDogjhF7s6PEQqtdfuRbVdHgAADwj0dQBc/iLCAqUAs7TqIelkTvUvaNJBGvWG54MBAFANihDqzskc6egeX6cAAKDGODQGAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMy+dF6MEHH9Tq1aslSTk5ORo1apTi4+OVnp4uh8PhXM4TYwAAwNh8WoTef/99bdq0SZJks9mUlJSkzp07a9WqVcrNzXUWJE+MAQAA+KwI/fjjj0pPT9d1110nSdq4caOsVqtSU1PVqlUrJScna+XKlR4bAwAACPTVhtPT05WYmKji4mJJ0r59+xQbG6uwsDBJksViUW5ursfGastut7v5Tt3bjre2Vxmz2ezxbdTle/SXz60iZHOPv2bz11wS2dxFNvf4czap5rl8UoS+/PJLbd26VR988IGef/55SZLValXLli2dy5hMJgUEBCg/P98jY5GRkbXKnJWV5e7bdYu3t3epsLAwRUdHe3w72dnZOn/+fJ2u05efW3XI5h5/zeavuSSy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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:49.417123Z",
     "start_time": "2024-09-23T00:38:49.226960Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 定义变换距离类型的函数\n",
    "def get_distance_type(row):\n",
    "    # 距离未知\n",
    "    if row == -1:\n",
    "        return -1\n",
    "    # 1千米内\n",
    "    elif row >= 0 and row <= 2:\n",
    "        return 0\n",
    "    # 1.5-2.5千米内\n",
    "    elif row >= 3 and row <= 5:\n",
    "        return 1\n",
    "    # 3-4.5千米内\n",
    "    elif row >= 6 and row <= 9:\n",
    "        return 2\n",
    "    # 5千米\n",
    "    elif row == 10:\n",
    "        return 3\n",
    "# 构建距离类型的特征属性\n",
    "new_data['Distance_type'] = new_data['Distance'].apply(get_distance_type)\n",
    "new_test_data['Distance_type'] = new_test_data['Distance'].apply(get_distance_type)\n",
    "# 新距离类型分布情况\n",
    "new_data['Distance_type'].value_counts()\n",
    "new_test_data['Distance_type'].value_counts()\n",
    "new_data\n",
    "# '''\n",
    "#  0    84309\n",
    "# -1    13858\n",
    "#  3    13321\n",
    "#  1    11194\n",
    "#  2     6108\n",
    "# Name: Distance_type, dtype: int64\n",
    "# '''\n"
   ],
   "id": "8f1065dc25ee393",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "        User_id  Merchant_id  Coupon_id Discount_rate  Distance  \\\n",
       "0       1113008         1361    11166.0          20:1         0   \n",
       "1       1449506         1361    11166.0          20:1         1   \n",
       "2       1449506         1361    11166.0          20:1         1   \n",
       "3       4781321         1361    11166.0          20:1         0   \n",
       "4       4781321         1361    11166.0          20:1         0   \n",
       "...         ...          ...        ...           ...       ...   \n",
       "124315  5389427         1184     1857.0        150:20         0   \n",
       "124316     6896         2511      869.0          50:5         0   \n",
       "124317  6598279         2846    11348.0        100:30         2   \n",
       "124318   287650         2123     1453.0          20:1        -1   \n",
       "124319   490662         5176     3923.0          20:5         7   \n",
       "\n",
       "        Date_received        Date  label  Dis_rate  Discount_type  ...  \\\n",
       "0          20160515.0  20160521.0      1  0.950000              1  ...   \n",
       "1          20160516.0  20160522.0      1  0.950000              1  ...   \n",
       "2          20160522.0  20160602.0      1  0.950000              1  ...   \n",
       "3          20160516.0  20160521.0      1  0.950000              1  ...   \n",
       "4          20160521.0  20160524.0      1  0.950000              1  ...   \n",
       "...               ...         ...    ...       ...            ...  ...   \n",
       "124315     20160521.0        null      0  0.866667              1  ...   \n",
       "124316     20160504.0        null      0  0.900000              1  ...   \n",
       "124317     20160522.0        null      0  0.700000              1  ...   \n",
       "124318     20160509.0        null      0  0.950000              1  ...   \n",
       "124319     20160418.0        null      0  0.750000              1  ...   \n",
       "\n",
       "        weekday6  weekday7  rec_coupon  Coupon_popu  Merchant_popu  \\\n",
       "0              0         1           1     0.000088       0.000088   \n",
       "1              0         0           2     0.000088       0.000088   \n",
       "2              0         1           2     0.000088       0.000088   \n",
       "3              0         0           3     0.000088       0.000088   \n",
       "4              1         0           3     0.000088       0.000088   \n",
       "...          ...       ...         ...          ...            ...   \n",
       "124315         1         0           1     0.000008       0.000008   \n",
       "124316         0         0           1     0.000008       0.000008   \n",
       "124317         0         1           1     0.000008       0.000008   \n",
       "124318         0         0           1     0.000008       0.000008   \n",
       "124319         0         0           1     0.000008       0.000008   \n",
       "\n",
       "        merchant_min_distance  merchant_max_distance  merchant_mean_distance  \\\n",
       "0                         0.0                    1.0                     0.2   \n",
       "1                         0.0                    1.0                     0.2   \n",
       "2                         0.0                    1.0                     0.2   \n",
       "3                         0.0                    1.0                     0.2   \n",
       "4                         0.0                    1.0                     0.2   \n",
       "...                       ...                    ...                     ...   \n",
       "124315                    0.0                    0.0                     0.0   \n",
       "124316                    0.0                    0.0                     0.0   \n",
       "124317                    2.0                    2.0                     2.0   \n",
       "124318                    NaN                    NaN                     NaN   \n",
       "124319                    7.0                    7.0                     7.0   \n",
       "\n",
       "        merchant_median_distance  Distance_type  \n",
       "0                            0.0              0  \n",
       "1                            0.0              0  \n",
       "2                            0.0              0  \n",
       "3                            0.0              0  \n",
       "4                            0.0              0  \n",
       "...                          ...            ...  \n",
       "124315                       0.0              0  \n",
       "124316                       0.0              0  \n",
       "124317                       2.0              0  \n",
       "124318                       NaN             -1  \n",
       "124319                       7.0              2  \n",
       "\n",
       "[124320 rows x 29 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User_id</th>\n",
       "      <th>Merchant_id</th>\n",
       "      <th>Coupon_id</th>\n",
       "      <th>Discount_rate</th>\n",
       "      <th>Distance</th>\n",
       "      <th>Date_received</th>\n",
       "      <th>Date</th>\n",
       "      <th>label</th>\n",
       "      <th>Dis_rate</th>\n",
       "      <th>Discount_type</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday6</th>\n",
       "      <th>weekday7</th>\n",
       "      <th>rec_coupon</th>\n",
       "      <th>Coupon_popu</th>\n",
       "      <th>Merchant_popu</th>\n",
       "      <th>merchant_min_distance</th>\n",
       "      <th>merchant_max_distance</th>\n",
       "      <th>merchant_mean_distance</th>\n",
       "      <th>merchant_median_distance</th>\n",
       "      <th>Distance_type</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1113008</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160515.0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1449506</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>1</td>\n",
       "      <td>20160516.0</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1449506</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>1</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>20160602.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4781321</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160516.0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4781321</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>20160524.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.000088</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124315</th>\n",
       "      <td>5389427</td>\n",
       "      <td>1184</td>\n",
       "      <td>1857.0</td>\n",
       "      <td>150:20</td>\n",
       "      <td>0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.866667</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124316</th>\n",
       "      <td>6896</td>\n",
       "      <td>2511</td>\n",
       "      <td>869.0</td>\n",
       "      <td>50:5</td>\n",
       "      <td>0</td>\n",
       "      <td>20160504.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124317</th>\n",
       "      <td>6598279</td>\n",
       "      <td>2846</td>\n",
       "      <td>11348.0</td>\n",
       "      <td>100:30</td>\n",
       "      <td>2</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.700000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124318</th>\n",
       "      <td>287650</td>\n",
       "      <td>2123</td>\n",
       "      <td>1453.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>-1</td>\n",
       "      <td>20160509.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124319</th>\n",
       "      <td>490662</td>\n",
       "      <td>5176</td>\n",
       "      <td>3923.0</td>\n",
       "      <td>20:5</td>\n",
       "      <td>7</td>\n",
       "      <td>20160418.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>124320 rows × 29 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 24
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:49.766756Z",
     "start_time": "2024-09-23T00:38:49.417123Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 距离柱状图\n",
    "x1 = np.arange(-1,4)\n",
    "dis_type1 = np.array(new_data['Distance_type'].value_counts().sort_index())\n",
    "dis_type2 = np.array(new_test_data['Distance_type'].value_counts().sort_index())\n",
    "plt.bar(x1,dis_type1,tick_label=x1, label='off_train_data', width=0.3)\n",
    "plt.bar(x1+0.3,dis_type2,label='off_test_data',width=0.3)\n",
    "plt.xlabel('距离类型')\n",
    "plt.ylabel('计数')\n",
    "plt.title('距离类型计数分布情况')\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "id": "b045ffc8192b50fb",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 25
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:49.908318Z",
     "start_time": "2024-09-23T00:38:49.766756Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 跟距离相关的独热编码\n",
    "def Get_dis_hot(df):\n",
    "    discols = ['Distance' + str(i) for i in range(-1,11)]\n",
    "    tmpdf = pd.get_dummies(df['Distance'].replace('null', np.nan))\n",
    "    tmpdf = tmpdf.astype(int)\n",
    "    tmpdf.columns = discols\n",
    "    df[discols] = tmpdf\n",
    "    return df\n",
    "new_data = Get_dis_hot(new_data)\n",
    "new_test_data = Get_dis_hot(new_test_data)\n",
    "# 集成新的数据集后，对缺失值处理\n",
    "new_data = new_data.fillna(-1)\n",
    "new_test_data = new_test_data.fillna(-1)\n",
    "new_data.isnull().sum()\n",
    "new_test_data.isnull().sum()\n",
    "# 再次保存最终文件，方便下次直接读取进行预测操作\n",
    "# '''\n",
    "# new_data.to_csv('./final_new_data.csv')\n",
    "# new_test_data.to_csv('./final_new_test_data.csv')\n",
    "# # 读取最终保存的文件\n",
    "# new_data = pd.read_csv('./final_new_data.csv',index_col=0)\n",
    "# new_test_data = pd.read_csv('./final_new_test_data.csv',index_col=0)\n",
    "# '''"
   ],
   "id": "2420b89be6cdf90e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "User_id                     0\n",
       "Merchant_id                 0\n",
       "Coupon_id                   0\n",
       "Discount_rate               0\n",
       "Distance                    0\n",
       "Date_received               0\n",
       "Dis_rate                    0\n",
       "Discount_type               0\n",
       "Discount_man                0\n",
       "Discount_jian               0\n",
       "Weekday                     0\n",
       "Is_weekend                  0\n",
       "weekday1                    0\n",
       "weekday2                    0\n",
       "weekday3                    0\n",
       "weekday4                    0\n",
       "weekday5                    0\n",
       "weekday6                    0\n",
       "weekday7                    0\n",
       "rec_coupon                  0\n",
       "Coupon_popu                 0\n",
       "Merchant_popu               0\n",
       "merchant_min_distance       0\n",
       "merchant_max_distance       0\n",
       "merchant_mean_distance      0\n",
       "merchant_median_distance    0\n",
       "Distance_type               0\n",
       "Distance-1                  0\n",
       "Distance0                   0\n",
       "Distance1                   0\n",
       "Distance2                   0\n",
       "Distance3                   0\n",
       "Distance4                   0\n",
       "Distance5                   0\n",
       "Distance6                   0\n",
       "Distance7                   0\n",
       "Distance8                   0\n",
       "Distance9                   0\n",
       "Distance10                  0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 26
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:49.991619Z",
     "start_time": "2024-09-23T00:38:49.910718Z"
    }
   },
   "cell_type": "code",
   "source": "new_data",
   "id": "e0b0005ad2213c4e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "        User_id  Merchant_id  Coupon_id Discount_rate  Distance  \\\n",
       "0       1113008         1361    11166.0          20:1         0   \n",
       "1       1449506         1361    11166.0          20:1         1   \n",
       "2       1449506         1361    11166.0          20:1         1   \n",
       "3       4781321         1361    11166.0          20:1         0   \n",
       "4       4781321         1361    11166.0          20:1         0   \n",
       "...         ...          ...        ...           ...       ...   \n",
       "124315  5389427         1184     1857.0        150:20         0   \n",
       "124316     6896         2511      869.0          50:5         0   \n",
       "124317  6598279         2846    11348.0        100:30         2   \n",
       "124318   287650         2123     1453.0          20:1        -1   \n",
       "124319   490662         5176     3923.0          20:5         7   \n",
       "\n",
       "        Date_received        Date  label  Dis_rate  Discount_type  ...  \\\n",
       "0          20160515.0  20160521.0      1  0.950000              1  ...   \n",
       "1          20160516.0  20160522.0      1  0.950000              1  ...   \n",
       "2          20160522.0  20160602.0      1  0.950000              1  ...   \n",
       "3          20160516.0  20160521.0      1  0.950000              1  ...   \n",
       "4          20160521.0  20160524.0      1  0.950000              1  ...   \n",
       "...               ...         ...    ...       ...            ...  ...   \n",
       "124315     20160521.0        null      0  0.866667              1  ...   \n",
       "124316     20160504.0        null      0  0.900000              1  ...   \n",
       "124317     20160522.0        null      0  0.700000              1  ...   \n",
       "124318     20160509.0        null      0  0.950000              1  ...   \n",
       "124319     20160418.0        null      0  0.750000              1  ...   \n",
       "\n",
       "        Distance1  Distance2  Distance3  Distance4  Distance5  Distance6  \\\n",
       "0               0          0          0          0          0          0   \n",
       "1               1          0          0          0          0          0   \n",
       "2               1          0          0          0          0          0   \n",
       "3               0          0          0          0          0          0   \n",
       "4               0          0          0          0          0          0   \n",
       "...           ...        ...        ...        ...        ...        ...   \n",
       "124315          0          0          0          0          0          0   \n",
       "124316          0          0          0          0          0          0   \n",
       "124317          0          1          0          0          0          0   \n",
       "124318          0          0          0          0          0          0   \n",
       "124319          0          0          0          0          0          0   \n",
       "\n",
       "        Distance7  Distance8  Distance9  Distance10  \n",
       "0               0          0          0           0  \n",
       "1               0          0          0           0  \n",
       "2               0          0          0           0  \n",
       "3               0          0          0           0  \n",
       "4               0          0          0           0  \n",
       "...           ...        ...        ...         ...  \n",
       "124315          0          0          0           0  \n",
       "124316          0          0          0           0  \n",
       "124317          0          0          0           0  \n",
       "124318          0          0          0           0  \n",
       "124319          1          0          0           0  \n",
       "\n",
       "[124320 rows x 41 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User_id</th>\n",
       "      <th>Merchant_id</th>\n",
       "      <th>Coupon_id</th>\n",
       "      <th>Discount_rate</th>\n",
       "      <th>Distance</th>\n",
       "      <th>Date_received</th>\n",
       "      <th>Date</th>\n",
       "      <th>label</th>\n",
       "      <th>Dis_rate</th>\n",
       "      <th>Discount_type</th>\n",
       "      <th>...</th>\n",
       "      <th>Distance1</th>\n",
       "      <th>Distance2</th>\n",
       "      <th>Distance3</th>\n",
       "      <th>Distance4</th>\n",
       "      <th>Distance5</th>\n",
       "      <th>Distance6</th>\n",
       "      <th>Distance7</th>\n",
       "      <th>Distance8</th>\n",
       "      <th>Distance9</th>\n",
       "      <th>Distance10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1113008</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160515.0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1449506</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>1</td>\n",
       "      <td>20160516.0</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1449506</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>1</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>20160602.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4781321</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160516.0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4781321</td>\n",
       "      <td>1361</td>\n",
       "      <td>11166.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>20160524.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124315</th>\n",
       "      <td>5389427</td>\n",
       "      <td>1184</td>\n",
       "      <td>1857.0</td>\n",
       "      <td>150:20</td>\n",
       "      <td>0</td>\n",
       "      <td>20160521.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.866667</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124316</th>\n",
       "      <td>6896</td>\n",
       "      <td>2511</td>\n",
       "      <td>869.0</td>\n",
       "      <td>50:5</td>\n",
       "      <td>0</td>\n",
       "      <td>20160504.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124317</th>\n",
       "      <td>6598279</td>\n",
       "      <td>2846</td>\n",
       "      <td>11348.0</td>\n",
       "      <td>100:30</td>\n",
       "      <td>2</td>\n",
       "      <td>20160522.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.700000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124318</th>\n",
       "      <td>287650</td>\n",
       "      <td>2123</td>\n",
       "      <td>1453.0</td>\n",
       "      <td>20:1</td>\n",
       "      <td>-1</td>\n",
       "      <td>20160509.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124319</th>\n",
       "      <td>490662</td>\n",
       "      <td>5176</td>\n",
       "      <td>3923.0</td>\n",
       "      <td>20:5</td>\n",
       "      <td>7</td>\n",
       "      <td>20160418.0</td>\n",
       "      <td>null</td>\n",
       "      <td>0</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>124320 rows × 41 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 27
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "",
   "id": "3c9576335a8a29fe"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:51.648985Z",
     "start_time": "2024-09-23T00:38:49.991619Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "# 决策树分类\n",
    "# 选取要预测的特征\n",
    "features = ['Dis_rate','Discount_type','Discount_man', 'Discount_jian',\n",
    "            'Distance','Distance_type','rec_coupon','Coupon_popu','Merchant_popu','merchant_min_distance',\n",
    "            'merchant_max_distance','merchant_mean_distance','merchant_median_distance',\n",
    "            'Is_weekend','Weekday']\n",
    "# 提取指定特征属性的数据集，并且划分为训练集和验证集\n",
    "X = new_data[features]\n",
    "y = new_data['label']\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,stratify=y)\n",
    "# 创建逻辑回归模型\n",
    "clf = DecisionTreeClassifier(random_state=0)\n",
    "\n",
    "# 训练模型\n",
    "clf.fit(X_train, y_train)\n",
    "\n",
    "# # 进行预测\n",
    "# y_pred = log_reg.predict(X_test)\n",
    "# \n",
    "# y_pred\n",
    "\n",
    "# 进行预测，得到预测概率\n",
    "y_pred_prob = clf.predict_proba(X_test)[:, 1]\n",
    "\n",
    "# 计算AUC\n",
    "auc_score = roc_auc_score(y_test, y_pred_prob)\n",
    "print(f'AUC: {auc_score:.2f}')"
   ],
   "id": "3ef04c810d561c2a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC: 0.79\n"
     ]
    }
   ],
   "execution_count": 28
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:38:53.326809Z",
     "start_time": "2024-09-23T00:38:51.652105Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "# 逻辑分类\n",
    "# 选取要预测的特征\n",
    "features = ['Dis_rate','Discount_type','Discount_man', 'Discount_jian',\n",
    "            'Distance','Distance_type','rec_coupon','Coupon_popu','Merchant_popu','merchant_min_distance',\n",
    "            'merchant_max_distance','merchant_mean_distance','merchant_median_distance',\n",
    "            'Is_weekend','Weekday']\n",
    "# 提取指定特征属性的数据集，并且划分为训练集和验证集\n",
    "X = new_data[features]\n",
    "y = new_data['label']\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,stratify=y)\n",
    "# 创建逻辑回归模型\n",
    "log_reg = LogisticRegression()\n",
    "\n",
    "# 训练模型\n",
    "log_reg.fit(X_train, y_train)\n",
    "\n",
    "# # 进行预测\n",
    "# y_pred = log_reg.predict(X_test)\n",
    "# \n",
    "# y_pred\n",
    "\n",
    "# 进行预测，得到预测概率\n",
    "y_pred_prob = log_reg.predict_proba(X_test)[:, 1]\n",
    "\n",
    "# 计算AUC\n",
    "auc_score = roc_auc_score(y_test, y_pred_prob)\n",
    "print(f'AUC: {auc_score:.2f}')"
   ],
   "id": "ec4204ec52b90ffa",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC: 0.83\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n"
     ]
    }
   ],
   "execution_count": 29
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T13:09:54.057782Z",
     "start_time": "2024-09-23T13:09:18.406526Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# ------------------------------------  第五部分 挖掘建模  --------------------------------------#\n",
    "# 查看属性特征\n",
    "new_data.columns\n",
    "new_test_data.columns\n",
    "# 选取要预测的特征\n",
    "features = ['Dis_rate','Discount_type','Discount_man', 'Discount_jian',\n",
    "            'Distance','Distance_type','Distance-1', 'Distance0',\n",
    "            'Distance1', 'Distance2', 'Distance3', 'Distance4', 'Distance5',\n",
    "            'Distance6', 'Distance7', 'Distance8', 'Distance9', 'Distance10',\n",
    "            'rec_coupon','Coupon_popu','Merchant_popu','merchant_min_distance',\n",
    "            'merchant_max_distance','merchant_mean_distance','merchant_median_distance',\n",
    "            'Is_weekend','Weekday','weekday1','weekday2','weekday3','weekday4',\n",
    "            'weekday5','weekday6','weekday7']\n",
    "# features = ['Dis_rate','Discount_type','Discount_man', 'Discount_jian',\n",
    "#             'Distance','Distance_type',\n",
    "#             'rec_coupon','Coupon_popu','Merchant_popu','merchant_min_distance',\n",
    "#             'merchant_max_distance','merchant_mean_distance','merchant_median_distance',\n",
    "#             'Is_weekend']\n",
    "\n",
    "\n",
    "\n",
    "# 提取指定特征属性的数据集，并且划分为训练集和验证集\n",
    "X = new_data[features]\n",
    "y = new_data['label']\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,stratify=y)\n",
    "# 进行网格搜索调参\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "# param_second_grid = {\n",
    "#     'learning_rate':[0.1,0.11,0.12,0.13],\n",
    "#     'max_depth': [4,6],\n",
    "#     'n_estimators': [160]\n",
    "# }\n",
    "# grid_second_search = GridSearchCV(estimator = GradientBoostingClassifier(),\n",
    "#                      param_grid = param_second_grid, scoring = 'neg_mean_absolute_error', cv = 3)\n",
    "# grid_second_search.fit(X_train , y_train)\n",
    "# grid_second_search.best_params_\n",
    "# '''\n",
    "# {'learning_rate': 0.13, 'max_depth': 4, 'n_estimators': 160}\n",
    "# '''\n",
    "# 集成学习提升决策树分类模型\n",
    "# n 160 d 4 a 0.8890163692846558 s 0.6836\n",
    "# n 160 d 4 l 0.12 a 0.8902440244868226 s 0.6825\n",
    "#   n_estimators 要执行的推进阶段的数量。梯度增强对过拟合具有较强的鲁棒性，因此大量的梯度增强通常能取得较好的效果。\n",
    "#  max_depth 单个回归估计量的最大深度。最大深度限制了树中的节点数。优化此参数以获得最佳性能;最佳值取决于输入变量的相互作用。\n",
    "# subsample 如果取值小于1，则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差，即防止过拟合，但是会增加样本拟合的偏差，因此取值不能太低\n",
    "# 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数，如果某叶子节点数目小于样本数，则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数，或者最少样本数占样本总数的百分比。如果样本量不大，不需要管这个值。如果样本量数量级非常大，则推荐增大这个值。\n",
    "# 最小样本数min_samples_split: 这个值限制了子树继续划分的条件，如果某节点的样本数少于min_samples_split，则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大，不需要管这个值。如果样本量数量级非常大，则推荐增大这个值。\n",
    "GBC_model = GradientBoostingClassifier(learning_rate=0.11,n_estimators=160,max_depth=6,min_samples_leaf=5,min_samples_split=5,subsample=0.6)\n",
    "# GBC_model.fit(X,y)\n",
    "GBC_model.fit(X_train,y_train)\n",
    "# 预测样本的各类标签（这里是0和1）的概率\n",
    "# predict(X)\t预测X的类。\n",
    "# predict_proba(X)\t预测X的类概率。\n",
    "\n",
    "GBC_model.predict_proba(X_test)\n",
    "# 预测标签为1的概率\n",
    "y_predict = GBC_model.predict_proba(X_test)[:,1]\n",
    "# AUC值，验证集上的性能结果\n",
    "y_auc = roc_auc_score(y_test,y_predict)\n",
    "y_auc\n",
    "\n",
    "#  subsample=0.6  0.8891626586931664\n",
    "#  subsample=0.5  0.8873431692819697\n",
    "# GBC_model = GradientBoostingClassifier(learning_rate=0.13,n_estimators=150,max_depth=14,min_samples_leaf=10,min_samples_split=10)  0.8775867674951399\n",
    "# GBC_model = GradientBoostingClassifier(learning_rate=0.13,n_estimators=160,max_depth=6,min_samples_leaf=10,min_samples_split=10,subsample=0.6) 0.8915678924725532\n",
    "# GBC_model = GradientBoostingClassifier(learning_rate=0.13,n_estimators=160,max_depth=5,min_samples_leaf=10,min_samples_split=10,subsample=0.6) 0.8906355360201681\n",
    "# GBC_model = GradientBoostingClassifier(learning_rate=0.13,n_estimators=160,max_depth=4,min_samples_leaf=10,min_samples_split=10,subsample=0.6) 0.8867111047205622\n",
    "# GBC_model = GradientBoostingClassifier(learning_rate=0.13,n_estimators=160,max_depth=6,min_samples_leaf=10,min_samples_split=10,subsample=0.7) 0.8883327967484997\n",
    "# GBC_model = GradientBoostingClassifier(learning_rate=0.13,n_estimators=160,max_depth=6,min_samples_leaf=5,min_samples_split=5,subsample=0.6) 0.8938654005839735  0.6748"
   ],
   "id": "bafba43369358f82",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8894066015741244"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 92
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T13:35:02.748544Z",
     "start_time": "2024-09-23T13:35:00.392373Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import xgboost as xgb\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import roc_auc_score\n",
    "features = ['Dis_rate','Discount_type','Discount_man', 'Discount_jian',\n",
    "            'Distance','Distance_type',\n",
    "            'rec_coupon','Coupon_popu','Merchant_popu','merchant_min_distance',\n",
    "            'merchant_max_distance','merchant_mean_distance','merchant_median_distance',\n",
    "            'Is_weekend','Weekday','weekday1','weekday2','weekday3','weekday4',\n",
    "            'weekday5','weekday6','weekday7']\n",
    "# 提取指定特征属性的数据集，并且划分为训练集和验证集\n",
    "X = new_data[features]\n",
    "y = new_data['label']\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,stratify=y)\n",
    "\n",
    "# 将数据转换为DMatrix格式\n",
    "dtrain = xgb.DMatrix(X_train, label=y_train)\n",
    "dtest = xgb.DMatrix(X_test, label=y_test)\n",
    "watchlist = [(dtrain,'train')]\n",
    "# xgb.XGBClassifier()\n",
    "params = {\n",
    "    \"booster\": 'gbtree',\n",
    "    'objective': 'binary:logistic',\n",
    "    'eval_metric': 'auc',\n",
    "    'eta': 0.01,\n",
    "    'max_depth': 12,\n",
    "    'min_child_weight': 1,\n",
    "    'gamma': 0,\n",
    "    'lambda': 1,\n",
    "    'colsample_bytree': 0.7,\n",
    "    'subsample': 0.6,\n",
    "    'colsample_bytree': 0.7,#(0.5~1),\n",
    "    'scale_pos_weight': 1\n",
    "}\n",
    "\n",
    "\n",
    "# model.fit(X_train,y_train)\n",
    "num_boost_round = 135  # 你可以根据需要进行调整\n",
    "bst = xgb.train(params=params, dtrain=dtrain, num_boost_round=num_boost_round)\n",
    "y_pred = bst.predict(dtest)\n",
    "print(y_pred)\n",
    "\n",
    "# 计算AUC\n",
    "auc_score = roc_auc_score(y_test, y_pred)\n",
    "print(f'AUC Score: {auc_score}')\n",
    "\n",
    "# params={\n",
    "#               \"booster\": 'gbtree',\n",
    "#               'objective': 'binary:logistic',\n",
    "#               'eval_metric': 'auc',\n",
    "#               'silent': 0,#(静默模式,1开0关)\n",
    "#               'eta': 0.01,#(0.01~0.2,,,0.01)\n",
    "#               'max_depth': 5,#(3~10,,,6)\n",
    "#               'min_child_weight': 1,\n",
    "#               'gamma': 0,\n",
    "#               'lambda': 1,\n",
    "#               'colsample_bylevel': 0.7,#(作用与subsample相似)\n",
    "#               'colsample_bytree': 0.7,#(0.5~1)\n",
    "#               'subsample': 0.6,#(0.5~1)\n",
    "#               'scale_pos_weight': 1,#(算法更快收敛)\n",
    "#         }\n",
    "\n",
    "# X_test\n",
    "# test_result = X_test[['User_id','Coupon_id','Date_received']]\n",
    "# test_result['Probability']=y_pred\n",
    "# test_result\n",
    "# 预测给定的测试集\n",
    "\n",
    "# pre_test = new_test_data[features]\n",
    "# dtest1 = xgb.DMatrix(pre_test, label='label')\n",
    "# result = bst.predict(pre_test)[:,1]\n",
    "# result\n",
    "# test_result = new_test_data[['User_id','Coupon_id','Date_received']]\n",
    "# test_result['Probability'] = result\n",
    "# # 查看描述性结果\n",
    "# test_result['Probability'].describe()\n",
    "# test_result.to_csv('./my_sample_submission.csv',index=None,header=None)"
   ],
   "id": "9f170d5fd670c47f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.36923134 0.6938205  0.2429119  ... 0.5272102  0.59495497 0.39366627]\n",
      "AUC Score: 0.8901306303856081\n"
     ]
    }
   ],
   "execution_count": 107
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T13:14:56.862142Z",
     "start_time": "2024-09-23T13:14:56.813756Z"
    }
   },
   "cell_type": "code",
   "source": "new_test_data",
   "id": "89ee8539036f1982",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "        User_id  Merchant_id  Coupon_id Discount_rate  Distance  \\\n",
       "0       4129537          450       9983          30:5         1   \n",
       "1       4005121          450       9983          30:5         0   \n",
       "2       4347394          450       9983          30:5         0   \n",
       "3       5139970          450       9983          30:5        10   \n",
       "4       6224386          450       9983          30:5         3   \n",
       "...         ...          ...        ...           ...       ...   \n",
       "113635  7106561         1687       2045        100:20        10   \n",
       "113636  4423817         8801       8706           0.9         6   \n",
       "113637  5726441         2779       2142          50:5         5   \n",
       "113638  5844269         1200       4853          0.95         0   \n",
       "113639  5555645         4965      13627          20:1         0   \n",
       "\n",
       "        Date_received  Dis_rate  Discount_type  Discount_man  Discount_jian  \\\n",
       "0            20160712  0.833333              1            30              5   \n",
       "1            20160706  0.833333              1            30              5   \n",
       "2            20160716  0.833333              1            30              5   \n",
       "3            20160729  0.833333              1            30              5   \n",
       "4            20160716  0.833333              1            30              5   \n",
       "...               ...       ...            ...           ...            ...   \n",
       "113635       20160729  0.800000              1           100             20   \n",
       "113636       20160730  0.900000              0             0              0   \n",
       "113637       20160724  0.900000              1            50              5   \n",
       "113638       20160705  0.950000              0             0              0   \n",
       "113639       20160706  0.950000              1            20              1   \n",
       "\n",
       "        ...  Distance1  Distance2  Distance3  Distance4  Distance5  Distance6  \\\n",
       "0       ...          1          0          0          0          0          0   \n",
       "1       ...          0          0          0          0          0          0   \n",
       "2       ...          0          0          0          0          0          0   \n",
       "3       ...          0          0          0          0          0          0   \n",
       "4       ...          0          0          1          0          0          0   \n",
       "...     ...        ...        ...        ...        ...        ...        ...   \n",
       "113635  ...          0          0          0          0          0          0   \n",
       "113636  ...          0          0          0          0          0          1   \n",
       "113637  ...          0          0          0          0          1          0   \n",
       "113638  ...          0          0          0          0          0          0   \n",
       "113639  ...          0          0          0          0          0          0   \n",
       "\n",
       "        Distance7  Distance8  Distance9  Distance10  \n",
       "0               0          0          0           0  \n",
       "1               0          0          0           0  \n",
       "2               0          0          0           0  \n",
       "3               0          0          0           1  \n",
       "4               0          0          0           0  \n",
       "...           ...        ...        ...         ...  \n",
       "113635          0          0          0           1  \n",
       "113636          0          0          0           0  \n",
       "113637          0          0          0           0  \n",
       "113638          0          0          0           0  \n",
       "113639          0          0          0           0  \n",
       "\n",
       "[113640 rows x 39 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User_id</th>\n",
       "      <th>Merchant_id</th>\n",
       "      <th>Coupon_id</th>\n",
       "      <th>Discount_rate</th>\n",
       "      <th>Distance</th>\n",
       "      <th>Date_received</th>\n",
       "      <th>Dis_rate</th>\n",
       "      <th>Discount_type</th>\n",
       "      <th>Discount_man</th>\n",
       "      <th>Discount_jian</th>\n",
       "      <th>...</th>\n",
       "      <th>Distance1</th>\n",
       "      <th>Distance2</th>\n",
       "      <th>Distance3</th>\n",
       "      <th>Distance4</th>\n",
       "      <th>Distance5</th>\n",
       "      <th>Distance6</th>\n",
       "      <th>Distance7</th>\n",
       "      <th>Distance8</th>\n",
       "      <th>Distance9</th>\n",
       "      <th>Distance10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4129537</td>\n",
       "      <td>450</td>\n",
       "      <td>9983</td>\n",
       "      <td>30:5</td>\n",
       "      <td>1</td>\n",
       "      <td>20160712</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4005121</td>\n",
       "      <td>450</td>\n",
       "      <td>9983</td>\n",
       "      <td>30:5</td>\n",
       "      <td>0</td>\n",
       "      <td>20160706</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4347394</td>\n",
       "      <td>450</td>\n",
       "      <td>9983</td>\n",
       "      <td>30:5</td>\n",
       "      <td>0</td>\n",
       "      <td>20160716</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5139970</td>\n",
       "      <td>450</td>\n",
       "      <td>9983</td>\n",
       "      <td>30:5</td>\n",
       "      <td>10</td>\n",
       "      <td>20160729</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6224386</td>\n",
       "      <td>450</td>\n",
       "      <td>9983</td>\n",
       "      <td>30:5</td>\n",
       "      <td>3</td>\n",
       "      <td>20160716</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113635</th>\n",
       "      <td>7106561</td>\n",
       "      <td>1687</td>\n",
       "      <td>2045</td>\n",
       "      <td>100:20</td>\n",
       "      <td>10</td>\n",
       "      <td>20160729</td>\n",
       "      <td>0.800000</td>\n",
       "      <td>1</td>\n",
       "      <td>100</td>\n",
       "      <td>20</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113636</th>\n",
       "      <td>4423817</td>\n",
       "      <td>8801</td>\n",
       "      <td>8706</td>\n",
       "      <td>0.9</td>\n",
       "      <td>6</td>\n",
       "      <td>20160730</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113637</th>\n",
       "      <td>5726441</td>\n",
       "      <td>2779</td>\n",
       "      <td>2142</td>\n",
       "      <td>50:5</td>\n",
       "      <td>5</td>\n",
       "      <td>20160724</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>50</td>\n",
       "      <td>5</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113638</th>\n",
       "      <td>5844269</td>\n",
       "      <td>1200</td>\n",
       "      <td>4853</td>\n",
       "      <td>0.95</td>\n",
       "      <td>0</td>\n",
       "      <td>20160705</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113639</th>\n",
       "      <td>5555645</td>\n",
       "      <td>4965</td>\n",
       "      <td>13627</td>\n",
       "      <td>20:1</td>\n",
       "      <td>0</td>\n",
       "      <td>20160706</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>20</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>113640 rows × 39 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 95
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T13:35:07.954835Z",
     "start_time": "2024-09-23T13:35:07.247232Z"
    }
   },
   "cell_type": "code",
   "source": [
    "pre_test1 = new_test_data[features]\n",
    "final_data = xgb.DMatrix(pre_test1)\n",
    "final_data\n",
    "result1 = bst.predict(final_data)\n",
    "result1\n",
    "result_test = new_test_data[['User_id','Coupon_id','Date_received']]\n",
    "result_test['Probability'] = result1\n",
    "result_test.to_csv('./24-09-23-01.csv',index=None,header=None)"
   ],
   "id": "442569432aceddb",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_16752\\1897180705.py:7: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  result_test['Probability'] = result1\n"
     ]
    }
   ],
   "execution_count": 108
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T13:03:41.087740Z",
     "start_time": "2024-09-23T13:03:40.335864Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "id": "ab94bc162256a645",
   "outputs": [],
   "execution_count": 89
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T00:56:03.831144Z",
     "start_time": "2024-09-23T00:56:03.157962Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 相关性分析\n",
    "corr = new_data[features].corr(method = 'pearson')  # 计算相关系数矩阵\n",
    "print('相关系数矩阵为：\\n',np.round(corr, 2))  # 保留两位小数\n",
    "# 绘制相关性热力图\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "plt.rcParams['font.sans-serif'] = 'SimHei'\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "plt.subplots(figsize=(10, 10))  # 设置画面大小\n",
    "sns.heatmap(corr, annot=True, vmax=1, square=True, cmap=\"Blues\")\n",
    "plt.title('相关性热力图')\n",
    "plt.show()\n",
    "# 距离箱型图\n",
    "# off_train_data['Distance'].isnull().sum()\n",
    "# off_test_data['Distance'].isnull().sum()\n",
    "# D1 = np.array(off_train_data['Distance'].values)\n",
    "# D2 = np.array(off_test_data['Distance'].values)\n",
    "# plt.boxplot([D1,D2],labels=('off_train_data','off_test_data'))\n",
    "# plt.title('距离箱型图')\n",
    "# plt.show()"
   ],
   "id": "e86487d21bc6bfe7",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "相关系数矩阵为：\n",
      "                           Dis_rate  Discount_type  Discount_man  \\\n",
      "Dis_rate                      1.00          -0.16          0.22   \n",
      "Discount_type                -0.16           1.00          0.20   \n",
      "Discount_man                  0.22           0.20          1.00   \n",
      "Discount_jian                -0.16           0.21          0.83   \n",
      "Distance                      0.01           0.03          0.21   \n",
      "Distance_type                 0.00           0.04          0.18   \n",
      "rec_coupon                    0.08          -0.06         -0.12   \n",
      "Coupon_popu                   0.02           0.14          0.29   \n",
      "Merchant_popu                -0.05           0.11          0.43   \n",
      "merchant_min_distance         0.03           0.03         -0.02   \n",
      "merchant_max_distance        -0.21           0.15          0.14   \n",
      "merchant_mean_distance        0.03           0.04          0.38   \n",
      "merchant_median_distance      0.06           0.02          0.31   \n",
      "Is_weekend                    0.03          -0.00          0.06   \n",
      "\n",
      "                          Discount_jian  Distance  Distance_type  rec_coupon  \\\n",
      "Dis_rate                          -0.16      0.01           0.00        0.08   \n",
      "Discount_type                      0.21      0.03           0.04       -0.06   \n",
      "Discount_man                       0.83      0.21           0.18       -0.12   \n",
      "Discount_jian                      1.00      0.21           0.19       -0.13   \n",
      "Distance                           0.21      1.00           0.97       -0.12   \n",
      "Distance_type                      0.19      0.97           1.00       -0.09   \n",
      "rec_coupon                        -0.13     -0.12          -0.09        1.00   \n",
      "Coupon_popu                        0.18      0.06           0.07       -0.08   \n",
      "Merchant_popu                      0.30      0.04           0.05       -0.09   \n",
      "merchant_min_distance             -0.01      0.15           0.15       -0.00   \n",
      "merchant_max_distance              0.18      0.21           0.23       -0.07   \n",
      "merchant_mean_distance             0.40      0.52           0.48       -0.16   \n",
      "merchant_median_distance           0.35      0.48           0.44       -0.11   \n",
      "Is_weekend                         0.06      0.04           0.03       -0.02   \n",
      "\n",
      "                          Coupon_popu  Merchant_popu  merchant_min_distance  \\\n",
      "Dis_rate                         0.02          -0.05                   0.03   \n",
      "Discount_type                    0.14           0.11                   0.03   \n",
      "Discount_man                     0.29           0.43                  -0.02   \n",
      "Discount_jian                    0.18           0.30                  -0.01   \n",
      "Distance                         0.06           0.04                   0.15   \n",
      "Distance_type                    0.07           0.05                   0.15   \n",
      "rec_coupon                      -0.08          -0.09                  -0.00   \n",
      "Coupon_popu                      1.00           0.75                  -0.06   \n",
      "Merchant_popu                    0.75           1.00                  -0.06   \n",
      "merchant_min_distance           -0.06          -0.06                   1.00   \n",
      "merchant_max_distance            0.29           0.27                   0.08   \n",
      "merchant_mean_distance           0.04           0.04                   0.31   \n",
      "merchant_median_distance        -0.00          -0.08                   0.29   \n",
      "Is_weekend                       0.04          -0.00                  -0.00   \n",
      "\n",
      "                          merchant_max_distance  merchant_mean_distance  \\\n",
      "Dis_rate                                  -0.21                    0.03   \n",
      "Discount_type                              0.15                    0.04   \n",
      "Discount_man                               0.14                    0.38   \n",
      "Discount_jian                              0.18                    0.40   \n",
      "Distance                                   0.21                    0.52   \n",
      "Distance_type                              0.23                    0.48   \n",
      "rec_coupon                                -0.07                   -0.16   \n",
      "Coupon_popu                                0.29                    0.04   \n",
      "Merchant_popu                              0.27                    0.04   \n",
      "merchant_min_distance                      0.08                    0.31   \n",
      "merchant_max_distance                      1.00                    0.39   \n",
      "merchant_mean_distance                     0.39                    1.00   \n",
      "merchant_median_distance                   0.22                    0.92   \n",
      "Is_weekend                                 0.03                    0.05   \n",
      "\n",
      "                          merchant_median_distance  Is_weekend  \n",
      "Dis_rate                                      0.06        0.03  \n",
      "Discount_type                                 0.02       -0.00  \n",
      "Discount_man                                  0.31        0.06  \n",
      "Discount_jian                                 0.35        0.06  \n",
      "Distance                                      0.48        0.04  \n",
      "Distance_type                                 0.44        0.03  \n",
      "rec_coupon                                   -0.11       -0.02  \n",
      "Coupon_popu                                  -0.00        0.04  \n",
      "Merchant_popu                                -0.08       -0.00  \n",
      "merchant_min_distance                         0.29       -0.00  \n",
      "merchant_max_distance                         0.22        0.03  \n",
      "merchant_mean_distance                        0.92        0.05  \n",
      "merchant_median_distance                      1.00        0.06  \n",
      "Is_weekend                                    0.06        1.00  \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x1000 with 2 Axes>"
      ],
      "image/png": "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nBQfH6/PP/9c3bt318GDBxUTE6P7779fFy9elCSZzWZrH5PJZE0Y/fz8dPLkSZlMJqWlpalmzZrq3r27rl27pn379unChQtavny5vv32W/3111/69ttvMyWIiYmJMpvNcnR0tB7nhtzMkN7YxtnZWS4uLpKk+fPna8mSJWratGmG4zk7O1sT0RuJLACg8CIhBQAUWps3b1ZqaqpOnTqllJQUbdiwQSkpKapQoUKOydKNpC05OVl16tTJ8RiBgYEKDAy0Pt+1a5c1yV22bJl2794tLy8vOTk5acGCBapcubIOHTqkCxcuyNvb29qvfv361v+fMmWKOnfuLElau3atHB0d9dlnn+mXX37RBx98oOTkZGvC2r59ew0dOlTe3t5q2bJlpgRbkgYOHKjdu3dnGX9259e+fXvNnDlTUuak9fDhw1qyZIksFou6dOlifb1atWpat26d9bmJFSsBFCR8ZuUJElIAQKH16aefSpL8/f0VGxurZcuWZWjv2bNnjv0dHR21adMmubi4ZJhZfPPNN9WgQYMM/VNSUnT9+nXdd9991tfCw8NVvnx5JScny8HBQW3bttXXX3+tkydP6v/+7//k5+enY8eOqXfv3vruu+9UpEgRJSUlycPDw7qPGzOSUvp9n999952cnJyUnJwsb29vXbx4UV5eXkpLS5Mkubm5ZTqPadOmKTk5OcMM6cqVK7Vo0SJt3749U+Lo5+enEiVKWJ/f3B4TE6M333xTFotFS5cula+vrw4cOKAePXpo8uTJzIoCADIgIQUAFGqJiYk6cOCAnJyctH//ftWuXduaYC1atEg+Pj4Ztm/fvn2G5w8++GCmfTo7O8vd3V1eXl45HvvkyZNq1qyZjh49Kknq0aOHDh48qGHDhmnOnDkZSnZLliyZKZlMSEjQ0qVLdfz4cf3888+6ePGiEhIS1KdPH/3www8aMWKEkpOTVb16dcXExEhKT4z/nRSWLl06U2yxsbEqW7asHnjggSzH7Oak+GazZs1SiRIl9P7772vIkCEaMmSIlixZonHjxtmcTQYAFD4sFQUAKNS2b9+upKQkWSwWvf7665o/f761rUiRInJzc8vwuFNlpmlpaTp48GCGVWYrVKigyMhINWjQQOXLl7e5j6JFi+r333/X/fffL19fX7Vo0UIrVqxQq1atNGHCBD377LNKTk7W2LFjVaRIEZnN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kv4p9c2qX9++feXt7a2IiAj17NlT3t7eWrRokc3zbt68ud5++209+eSTmjFjhgYNGqQnnnhCBw4csG6TVQltTrHY8uWXX+rpp5/WU089pdDQ0Ezt2ZXsrl27Vs2bN1fdunXVr18/xcTESJKeffZZeXt7S5JatGghb29vffPNN9Z+K1euVJMmTVSvXj0NHjxYsbGxkqS5c+dq1KhRmjdvnnx8fNSsWTP9/PPP1n4bNmxQ69at1aBBAw0bNizDv3twcLBat26txx9/XLNmzVJaWlquzh0AAAC4XaZ8+ijoDJ8hPXPmjN566y19/fXXql69upo2bapt27apf//+atKkidavX6+EhARNnTo1Q78vvvhCP/30kyZNmqR69epJksLDwzVo0CD16dNHGzdulIeHh9555x1rn6NHj2rz5s1asWKFOnXqZN3n5cuXNXz4cA0aNEhbtmxRiRIlNH/+fJv95s6dq7CwMJUpU0YLFixQWFiYevfunavzjo2N1eDBg7V48WJ17txZ1apVyzJR/LfsYsnJX3/9pXfeeUdvv/22Pv74Y23cuDFXMcbFxWnMmDEaMWKEvvnmGzk6OmrJkiWSpDVr1igsLExSetIaFham1q1bS5IOHz6sSZMmacqUKdq4caMuXbqkFStWWPcbEhKiM2fO6Ouvv1b9+vX1/vvvS5J+/fVXvfXWWxo1apTWrl2rixcvas6cOZKkn3/+WePGjdOYMWP02Wefae3atXe1pBkAAADAnWf495C2b99eDz/8sCTp+eef1+XLlxUYGKiSJUvqtddek8lkUu/evRUQEJChX3x8vD7//HM5OTlZX9uwYYN8fHzUuXNnSVJAQIAOHTqUoc+0adPk6empbt266eOPP5Ykubm56fvvv5ebm5sOHDigpKQknTp1ymY/V1dXSZLZbJarq6s8PDxyfd5+fn5ycXGRp6enWrVqpW3btik5Odlmv+xiycl3332nJ598Ui1btpSUPrO7ePFim/0cHBzk6Ogoi8WiUqVKKTAw0DoreXN5r7u7e4Zzr1y5snbt2iUnJyft379faWlpGcbTwcFBkyZNkouLizp16qS3335bUvoMcMeOHa0ztRMnTtT58+clSV9//bVatWqlpk2bSpI6duyo7du367nnnrN5HgAAAADyJ8MTUhcXl0z/7+joqEuXLqlhw4aSpNTUVMXFxen69evW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segIVRb7x23REapER2b/UOcXPxYdoUoelZSIjlBlxaVK0RGqpI1ZPdERqiT4t1uiI1SZvo68/p048eMy0RGqpNeoBaIjVImHzzTREaqsa7O6oiNUSVFJqegIRC/Ee0iJiIiIiIhICI6QEhERERERVUBe8zvkgyOkREREREREJAQLUiIiIiIiIhKCU3aJiIiIiIgqILPejbLBEVIiIiIiIiISggUpERERERERCcEpu0RERERERBXQYZ9dreAIKREREREREQnBgpSIiIiIiIiE4JRdIiIiIiKiCrDLrnZwhJSIiIiIiIiEYEFKREREREREQnDKLhERERERUQUU7LKrFRwhJSIiIiIiIiFem4I0ODgY7u7uomNIwtmzZ+Hs7FzhNiIiIiIiIm16bQpSbXJ2dsbZs2dFx/hHOnXqhIMHD1b5OGtra6SlpWkhERERERGRdCgU0vyQOxakBADQ09ODsbGx6BhERERERPQaEVqQuru7w9vbGz179sS8efOwaNEi2NvbIyYmBklJSXBzc0OnTp0wffp0PHjwQO244OBg/Oc//0Hv3r0RHR2t2hcfH48hQ4bAzs4OHh4eyMzMVPuZP/zwA7p16wZHR0f897//VW2PiopC//79YWtrC3d3d2RlZQH4v6m+mo6bMGECrK2tkZ6ejo8//hjW1tbYunVrhc/b2dkZPj4+6N69O9asWYOpU6eia9euuHTp0guzXLlyBba2tkhPTwcAeHt7Y9asWZX6XR84cADvvfcenJycEBcXV2Z/eVN2w8LC4OzsDFtbW3h4eODevXsAgPfffx/W1tYAgD59+sDa2hqHDh1SHbdv3z707NkTdnZ28PT0RF5eHgBg48aNmDdvHjZt2gR7e3v07t0biYmJquMiIiLQr18/dOrUCTNnzlT7/x4aGop+/fqhS5cuWLduHZRKZaWeOxERERERSZPwEdLU1FQsWrQIISEhaN26NXr16oXo6GhMnDgRPXv2RHh4OAoKCrBy5Uq14/bv348zZ87A398fdnZ2AIC0tDRMnToVn3zyCSIjI1GvXj0sWbJEdUxycjKOHDmCvXv3wtXVVfU9c3Nz8eWXX2Lq1KmIiopCgwYNEBAQUOFxGzduREJCAszNzREUFISEhASMHz++Us87Ly8Pnp6e2L59O0aMGIFWrVohLi7uhVlsbGwwatQofP3110hOTsaxY8fg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G91BdIQq+evOQ9ERaryo69miI1TJzdwi0RGqZPuSzaIjVN0b5qITVMn//vOZ6AhV0rF5PdERynXyjxzRETR6r3VD0RH+EY6QEhERERERkRAsSImIiIiIiEgIec2lIiIiIiIiEoBddrWDI6REREREREQkBAtSIiIiIiIiEoJTdomIiIiIiCqg4IxdreAIKREREREREQnBgpSIiIiIiIiE4JRdIiIiIiKiCnDGrnZwhJSIiIiIiIiEYEFKREREREREQnDKLhERERERUQV02GZXKzhCSkREREREREKwICUiIiIiIiIhOGWXiIiIiIioApywqx01aoQ0ODgY7u7uomNInqbfE393RERERERU3WpUQapNzs7OOHv2rOgYWjN48GAEBQVV6Zi0tDRYW1trKREREREREdV0nLJLAAADAwMYGBiIjkFEREREJE2cs6sVWh8hdXd3h7e3N3r27Il58+Zh0aJFsLe3R0xMDJKSkuDm5oZOnTph+vTpePDggdpxwcHB+M9//oPevXsjOjpatS8+Ph5DhgyBnZ0dPDw8kJmZqfYzf/jhB3Tr1g2Ojo7473//q9oeFRWF/v37w9bWFu7u7sjKygLwf9NVNR03YcIEWFtbIz09HR9//DGsra2xdevWCp+3s7MzfHx80L17d6xZswZTp05F165dcenSJQDAyZMnMWTIENjb22PBggUoKipSHbtv3z707NkTdnZ28PT0RF5eHgBg48aNmDdvHjZt2gR7e3v07t0biYmJlfr/sHnzZnTt2hV9+/bF77//XmZ/eVN2d+zYAScnJ3Ts2BFffvmlKme7du3Qp08fAIC1tTWsra3xyy+/qI77+uuv0a1bN9jb28Pb2xslJSUAgHnz5mHDhg1YvHgx7OzsMHDgQFy/fl113DfffINevXqhS5cu8PX1RXFxMQBAqVRi+/bt6N27N5ycnLBr165KPW8iIiIiIpKuapmym5qaikWLFiEkJAStW7dGr169EB0djYkTJ6Jnz54IDw9HQUEBVq5cqXbc/v37cebMGfj7+8POzg7Ak2miU6dOxSeffILIyEjUq1cPS5YsUR2TnJyMI0eOYO/evXB1dVV9z9zcXHz55ZeYOnUqoqKi0KBBAwQEBFR43MaNG5GQkABzc3MEBQUhISEB48ePr9TzzsvLg6enJ7Zv344RI0agVatWiIuLQ2pqKjw9PTFu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LEhfUpMmTRAaGqpxn5GRUbVmadeuXblZ6tSpU61ZiIiIiIiIKosF6UvS09NTW6JEJENDQ8lkISIiIiIiqiwWpERERERERBXhnF2tELbsCxEREREREb3eWJASERERERGREJyyS0REREREVAEF5+xqBUdIiYiIiIiISAgWpERERERERCQEp+wSERERERFVQMEZu1rBEVIiIiIiIiISggUpERERERERCcEpu0RERERERBXgjF3t4AgpERERERERCcGClIiIiIiIiITglF0iIiIiIqKKcM6uVnCElIiIiIiIiITgCCm9Nh6XKkVHqDJDPXldMzI1ltc/KfcLS0RHqJI6RvL6/QJAHUN5ZS56XCo6QpXI7d8IAKhbS17nhJ6uvIZEujarKzpClWx/w1x0hKq7lyE6QZUo5ff2h14z8vqrQEREREREJICCc3a1Qn6XVomIiIiIiKhGYEFKREREREREQnDKLhERERERUQUUnLGrFRwhJSIiIiIiIiFYkBIREREREZEQnLJLRERERERUAc7Y1Q6OkBIREREREZEQLEiJiIiIiIhICE7ZJSIiIiIiqgjn7GoFR0iJiIiIiIhICBakREREREREJASn7BIREREREVVAwTm7WsERUiIiIiIiIhKCBSkREREREREJwSm7REREREREFVBwxq5WSHKENDg4GO7u7qJjvFKanpOo5ymlLERERERE9PqSZEGqTc7Ozjh79qzoGACAwYMHIygoSHQMAC+XJS0tDdbW1lpKRERERERENR2n7ApkYGAAAwMD0TEASCsLEREREZHUcMaudlR6hNTd3R3e3t7o2bMn5s2bh0WLFsHe3h4xMTFISkqCm5sbOnXqhOnTp+PBgwdqxwUHB+M///kPevfujejoaNW++Ph4DBkyBHZ2dvDw8EBmZqbaz/zhhx/QrVs3ODo64r///a9qe1RUFPr37w9bW1u4u7sjKysLwP9NO9V03IQJE2BtbY309HR8/PHHsLa2xtatWyt83s7OzvDx8UH37t2xZs0aTJ06FV27dsWlS5cAACdPnsSQIUNgb2+PBQsWoKioSHXs5s2b0bVrV/Tt2xe///57me9d3jTZffv2oWfPnrCzs4Onpyfy8vIAABs3bsS8efOwadMm2Nvbo3fv3khMTKzwOfyTLDt27ICTkxM6duyIL7/8UvX82rVrhz59+gAArK2tYW1t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FYWLFy+iY8eOaNiwIQDg+PHj5R7z4YcfwsnJCdevX0fnzp1hbGz8yvKwICUiIiIiInqNmJqaVvk+0ObNm6N58+avPAun7BIREREREZEQHCElIiIiIiKqgKJmzNiVHI6QEhERERERkRAsSImIiIiIiEgITtklIiIiIiKqAGfsaodCqVQqRYcgqg5JN/NER6gyfV15/dOX/6hEdIQaTU9m5wMgv/ttaunrio5QJQVF8nvNGehxcpY2FZWUio5QJSWl8nsbKrd3zk6u80VHqJKCC5tERyjXH5kPRUfQqLVZbdER/hH+VSAiIiIiIiIhOGWXiIiIiIioIjKb9SMXHCElIiIiIiIiIViQEhERERERkRCcsktERERERFQBBefsagVHSImIiIiIiEgIFqREREREREQkBKfsEhERERERVUBua2vLBUdIiYiIiIiISAgWpERERERERCQEp+wSERERERFVgDN2tYMjpERERERERCQEC1IiIiIiIiISggUpERERERERCcF7SImIiIiIiCrCm0i1giOkREREREREJAQLUhk7e/Ys7O3tRcfQaN68edi4caNWf4a7uzuCg4O1+jOIiIiIiEh7OGWXiIiIiIioAgrO2dUKjpASERERERGRECxIa5iwsDA4OzvD1tYWHh4euHfv3gsff/v2bbRt2xZFRUVYtmwZRo4cCQAYOXIkoqKiAAChoaHo168funTpgnXr1kGpVAIAlEoltm/fjt69e8PJyQm7du3S+DMSEhLg6OiIK1euAACKi4uxevVqODk5wdnZGYcPH1Y99unX48aNQ4cOHTBhwgQUFBSosnp4eMDOzg6ff/45iouL/9kvi4iIiIiIhGJBWoPk5+dj/vz5mDVrFg4dOgQ9PT3s3Lnzhcc0btwYDRs2xM2bN3Hz5k3UrVsXAJCamoo2bdogMTERCxcuxPz587Fnzx6EhYXh4MGDAJ4Uv1u3bsW6deuwceNGbNiwAYmJiWrf//r165g5cybWrVsHGxsbAMDWrVsRFRWFnTt3YuHChZg7dy5u3rypOmbVqlUYOXIkfvjhB1y+fBmHDh0CACxevBi6uro4ePAgWrdujQsXLryy3x0RERER0YsoFNL8kDsWpDWIrq4u9PT0UFRUBBMTEwQGBmLmzJkVHte2bVvcuHEDxcXFMDc3x+XLl6FQKGBlZYWQkBD07dsXvXr1QuvWrTF06FAcP34cwJOR0w8++AB2dnaws7ND7969VfsA4O7du5g0aRJ69OgBR0dH1fbQ0FBMmDABrVu3hrOzM9q2bYuTJ0+q9vfv3x9Dhw6FtbU1HB0dkZmZiZKSEsTExOCzzz6DlZUVPD090bhx41f42yMiIiIiourGgrQGMTIywr///W/s378fjo6O8PDwUBt5LE+bNm1w5coVGBgYoHnz5oiJiUGbNm0AAFlZWTh27Bjs7e1hb2+P3bt3IyMjQ7Vvz549qn1Hjx5V7QOA77//Hi4uLoiOjkZ2drZqe1ZWFlavXq067rffflM7rkuXLqrP9fX1oVQqkZOTg8ePH8Pc3BwAoKOjAwsLi3/2CyMiIiIiIqHYZbcGuXfvHurVq4fvv/8eDx8+hK+vL1asWIGgoKAXHte2bVts2bIFDg4OaN68ObZt26YqCs3MzDBmzBiMGzcOAPD48WOUlpaq9o0aNQr9+/cHABQVFUFfX1/1fQcNGgRvb28UFxdj06ZNWLJkieq4GTNmoEOHDgCAR48ewdjYWHXcs58/9cYbb0BXVxfZ2dkwMTGBUqlUK2KJiIiIiLSpBsyOlSSOkNYg9+7dw/jx43Hy5Enk5eVBR0dHVTy+SNu2bfHbb7+hRYsWaNGiBX777Te0bdsWADB8+HBER0fjzp07KCkpwfr167FhwwbVvkOHDiE/Px+FhYXw8fHB3r17Vd+3RYsWAIDJkycjPDwcf/75p+q44OBgPH78GLm5uZg+fTqOHj36wox6enp47733sGnTJqSlpWHr1q3Iysp6id8SERERERFJBUdIa5CWLVti7ty58PPzw507d2BjY4Nly5ZVeJyVlRXq1auHFi1aoHnz5gCgKkjt7e3x2WefwcvLC7dv34ajoyP8/f0BAEOHDkV2djYmT56MvLw8uLi44PPPPy/z/U1NTfHBBx9g3bp12LRpEyZOnIgHDx7gww8/RElJCVxdXfGvf/2rwpyLFy+Gt7c3hg0bhi5duqBdu3ZV+fUQEREREZHEKJRP1/AgquGSbuaJjlBl+rrymhyS/6hEdIQaTU9m5wMgv+5/tfR1RUeokoIi+b3mDPQ4OUubikoqnhklJSWl8nsbKrd3zk6u80VHqJKCC5tERyjXjbuFoiNo1MLESHSEf4QjpK+BxMRETJkyReO+kSNHwtvbu5oTERERERERsSB9LbRr1w6hoaEa99WpU6d6wxAREREREf1/LEhfA4aGhrC0tBQdg4iIiIhIthTss6sVvJGDiIiIiIiIhGBBSkREREREREJwyi4REREREVEF5NY5Xi44QkpERERERERCsCAlIiIiIiIiIThll4iIiIiIqAKcsasdHCElIiIiIiIiIViQEhERERERkRCcsktERERERFQBdtnVDo6QEhERERERkRAsSImIiIiIiEgITtklIiIiIiKqEOfsagNHSImIiIiIiEgIFqREREREREQkhEKpVCpFhyAiIiIiIpKy9Nwi0RE0smhgIDrCP8IRUiIiIiIiIhKCBSkREREREREJwS67REREREREFWCPXe3gCCkREREREREJwYKUiIiIiIiIhOCUXSIiIiIiogooOGdXKzhCSkREREREREKwICUiIiIiIiIhOGWXiIiIiIioAgr22dUKjpASERERERGRECxIiYiIiIiISAgWpEQvobi4GEFBQXBzc0OPHj2QnJyMUaNGITU1VXQ0jeSWl7RPjudEeHg4Zs6ciTFjxuDGjRuYMWMGcnJyRMeqMW7dulXuB70acjyH5Zb5559/xtq1azFr1iykp6dj9erVePTokehY5ZJb3teeQqIfMseClOglLF68GFFRURg1ahTy8/NhZGQEW1tb+Pj4iI6mkdzyAkBUVBScnZ3Rpk0b1YeNjQ3atGkjOppGcssrt3Ni/fr1+Oqrr2BlZYWrV69CR+fJny9fX1/ByWoOZ2dn9OnTB87OzqrPn35I0dPXl6YPKZLjOSy3zLt374aHhwcyMjJw7NgxFBcX4+LFi1i8eLHoaBrJLS+RtiiUSqVSdAgiuXFwcEBwcDCsrKzg4OCAsLAwlJaWYsiQIbhw4YLoeGXILS8AdOvWDa6urnBzc4O+vr7aPgsLC0Gpyie3vHI7JxwdHbFnzx60atVKlbe4uBgjRozA+fPnRcfTKCoqCitXrkRGRoZqm1KphEKhwOXLlwUmq1hhYSEuXryITZs2wdPTE126dBEdqYz09HTV50/z7ty5EzNnzkTv3r0FJtNMjuew3DL36NEDmzZtQocOHVR5Hz58iLFjx+LcuXOi45Uht7yhoaGVetzw4cO1mkOkzL+LRUfQyKyefsUPkjB22SV6CWZmZkhMTISVlZVqW2pqKiwtLQWmKp/c8gKAQqHA6NGj0axZM9FRKkVueeV2TtSrVw+3bt1Cq1atVNtyc3PRqFEjgalezM/Pr9yLFFJnZGQEBwcHBAYG4qOPPkJwcLDoSGU8f6HnrbfegpOTEzw9PSVZkMrxHJZbZn19fSgU6vMXS0tLUadOHUGJXkxueX/66SfV58XFxfjll1/QqFEjWFpaIiMjA9nZ2WjXrl2NLkhrwOxYSWJBSvQS5syZg2nTpmH//v0oKCjAqlWrcP78eaxcuVJ0NI3klhcAvvjiC/j7+2PVqlVo2LCh6DgVklteuZ0TU6dOxbRp09CvXz8UFRVh165diI6OxvTp00VHK5fcLlJocvfuXWRnZ4uOUWkGBgbIysoSHUMjOZ7Dcss8duxYTJw4EaNHj8bjx49x5MgRRERE4KOPPhIdTSO55d2zZ4/q888//xzTp0/HtGnTVEX1li1bcPHiRVHxSMY4ZZfoJaWmpuLQoUPIysqCmZkZBg0apDbaJDVyy+vu7o5r166hoKAALVu2hLGxsWrf7t27BSbTTG55AfmdE4mJiQgNDVXlHTZsGOzt7UXHKteBAwcQFRUlm4sUzs7OaqM1paWluH37Nj7++GN4eXkJTKaZu7t7mbzJycno0aMH1q5dKzBZ+eR2DgPyyxwaGoqwsDBV3uHDh2Po0KGiY5VLbnmf6tixIw4ePKg2qyY9PR3Dhw9HQkKCwGTalSXRKbumMp+yy4KUiCQpJCSk3H2urq7VmKRy5JaXtE9uFymev2dNoVDAzMxMshcpnn/NKRQKmJqaomvXrmWmQRLRq+Xh4QE9PT3MmDEDpqamyM7OxubNm/Hw4UPs2LFDdDytyX4gzYK0SV0WpESvnW3btmH8+PFq94XFx8cjICBAbUqLVOTn5+Pf//43oqOjcffuXTRu3Bj9+vXDtGnTULt2bdHxqqSoqAgGBgaiY1SaVPNmZWXB398fbm5u6NmzJ1xdXdGoUSMsX74cjRs3Fh2vjJKSEnz77bdlzuHRo0dDV1dXdDyN5HqRorS0FLm5uXjjjTdY2L1CeXl52LhxI/r06YPOnTtj4sSJsLCwwJw5cyR7z6DcMj9+/Bh79+6FnZ0d2rVrh0WLFqFZs2b49NNPJfnvhNzyPuvOnTvw8/PDiRMn8PjxY+jq6qJHjx5YvHgxTE1NRcfTGhak2sGClOgltGnTBgkJCWojHrdv34aLiwt+/fVXgck0mzVrFtLS0jBx4kQ0adIEt27dwo4dO9C8eXPJTm3Lzs5GYGAgbty4gZKSEgBPOpSmpKTg1KlTgtOVJbe8kyZNQt26deHl5QVTU1OkpKQgKCgIDx48QEBAgOh4ZSxZsgSnTp3C2LFjYWpqioyMDOzduxe9e/fGggULRMd7obt37yIjIwNNmzaV9NTdO3fuwNfXF7GxsSgpKYGuri5cXFywaNEimJiYiI5XhtwutM2aNQu3b9/GkiVL0KJFC5w5cwbbtm1DkyZNsGLFCtHxNJJbZj8/PyQmJmLNmjVo06YNDh48iJ07d6Jr166YN2+e6HhlyC2vJqWlpcjJycEbb7wh+SL6VWBBqh0sSImq4Ol9Ee7u7tiyZYvqTY9SqURcXBxOnjyJsLAwkRE1sre3R3BwsFpzlRs3bsDNzU2y93qMGzcO9evXR1FREUpLS9GrVy8EBARgzJgxkmyoIbe8HTt2RGRkpNqV7MzMTAwePBiJiYkCk2nWpUsX7NmzB61bt1Ztu3LlCsaNG4ezZ88KTFa+vLw8zJ07F9HR0TAwMEBxcTH69u2L5cuXq13MkoqJEydCX18fn332GUxNTZGeno6AgACUlJRg69atouOVIbcLbU+X9WjatKlq282bNzFq1CjJnsNyy9y1a1d8//33aNGihWrb9evX4e7ujtOnT4sLVg655X3Wo0ePcOjQIWRkZOD5UkKKf/NeldsPHouOoFHjuvLuUyvv9ETVbO7cuQCe3Kvk5+enms6mo6OD5s2bY/Xq1SLjlatNmzb45Zdf1ArSX375Be+++67AVC+WlJSEo0ePIiUlBevWrcPYsWNhYWGBwMBASf6xk1teS0tLxMfHq7XnP3PmjNobTymxsLBAdna2WkGanZ0t6Q62fn5+KC0txcmTJ9GkSRNkZWXBz88Pfn5+kiyYLly4gLCwMNVyKg0bNsSCBQsku4RDbGys2oW29u3bw8bGBm5uboKTadawYUMkJyervcb+/PNPNGjQQFyoCsgtc61atZCTk6NW4OXm5krytglAfnmfNW3aNFy+fBldu3aVRV6SNhakRFVw/PhxAICNjQ3Cw8MlOcqhiZGREebOnYv9+/fDzMwM6enp+PXXX9G7d294e3sDgOSmXzVp0gSnT59Gv379cO3aNRQWFqJ169a4evWq6GgayS2vt7c3PD09cfjwYVhYWCAtLQ2JiYmSnK4LAC1atMBnn32Gvn37wtzcHGlpaYiOjsb777+PTZs2AZDeVfm4uDj89NNPaNKkCQDA1NQU8+fPx8iRIwUn06xz586IjIyEh4eHatuhQ4fQvXt3ganKJ7cLbZ999hm++OILDB8+XPWaO3jwIJYuXSo6WrnklnncuHH4/PPPMX78eFXeXbt2YeLEiaKjaSS3vM9KTEzEgQMH8Pbbb4uOQjUAp+wSvQQPDw9s2rQJRkZGoqNUytM37C8itTfzUVFRmD17Nk6cOIE1a9aoppE2a9ZMkh385JYXANLS0nDo0CFkZmbC3NwcgwYNUo2OSc3TCycvIrWLKsOHD8dHH32EUaNGqbYdOHAA3333HUJDQ8UFK4ebmxsuXrwIc3Nz1X262dnZ6NChg2oERErdgSdOnIhTp06hY8eOZS601a9fH4D0zokLFy4gJCQEmZmZMDMzw8iRI9GhQwfRsV5IbpkPHTqE4OBgtbwDBw4UHatccsv71Pjx4+Hm5oZBgwaJjlKtbudJdMqusbzHGFmQEr1CUu2ompeXJ5vR3Gfdv38fxsbGKC0tRUREBB4+fIjhw4dLsrsjoDnvsGHDZPm7p38uISEBkyZNQseOHWFlZYWbN2/iwoUL2Lp1qyTXcXxRV+CnpNQdWI4X2ohqisjISKxevRrvv/8+OnfurPZ3zsHBQWAy7WJBqh0sSIlegtw6qrZv3x7vvfceBg4ciN69e6NWrVqiI1Xo999/R1xcHIqLy3a045vMfy4qKgorV65ERkaGaptSqYRCocDly5cFJtPs6fk7cOBAtG/fXnScSsvIyEB4eDgyMjJgbm6OYcOGSX5JhKSkJFVeOfyu5dLF+Pz589iwYYPGJjDR0dGCUr2Y3DL/+eef2Lp1q8a8Uhrdf0pueZ/l7OyscbtCoZDkufGqsCDVDhakRC9Bbh1V//rrLxw7dgzHjh3D1atXVW/ue/XqJckRXQBwdHREq1atYGlpWWaf1KbhyVG3bt3g6uoKNzc3tfV0AUhy2u7//vc/REdH4/jx49DR0cGAAQMwcOBAvPPOO6Kj1RhZWVmYOnUqUlNT0bhxY2RnZ+PNN9/E5s2bJVlE5+XlYd68eYiOjoa+vr7kuxg7OzvDzs4OI0aMKPOa69y5s6BULya3zIMHD8Ybb7yBIUOGlMkrpdH9p+SWl4A7Ei1IG7EgJXr92NnZqXVU3bdvH2JjYxEYGIjvv/9edLwXunv3LiIiIrB582aUlJSgT58+mDp1Kt58803R0dR4enpixIgRcHFxER2lRurevTv27dsn6S615UlKSkJ0dDT27duHN954AwMHDoS7u7vkRsfktk7m5MmTYWpqioULF8LAwACPHj3CsmXLkJmZKcllX2bPno38/HwsXrxYrYtxnTp1JNnF2MHBASEhIRovskmV3DLb2dnh0KFDku0W/jy55X1eeno6Tp48iczMTHz44Yc4evQoxo4dq1qBoCZiQaodLEiJXkL//v0xbdo09OvXDz169EBcXBzu3buHgQMH4sKFC6LjaZSfn48TJ04gKioKJ0+exJtvvomBAweiqKgIoaGhiIqKEh1Rzdq1a7F9+3Y0atQIhoaGavukMh2oT58+OHjwIOrUqQNnZ+dy/whLJe+zDhw4gKioKKxatUpyhdyL/PLLL4iKikJUVBQKCgrQr18/lJSU4NKlSwgODhYdT43c1sm0t7dHeHg4zM3NVdtu3bqFoUOHSnZt2p9++kmtWLp58yZGjhyJc+fOCUym2ebNm3Hz5k34+/uXGQ2TKrllXrJkCYyNjfHll1+KjlIpcsv7rMjISMydOxdt27bFb7/9hrCwMEyfPh29e/fGnDlzRMfTGhak2iHv9ESCzJo1C7Nnz4aTkxNcXFwwZMgQAEDHjh0FJ9NsypQpiI+PR8uWLfH+++9j9uzZsLKyAvBkOq8Uu8CGhobCx8cHrVq1Eh2lXCtWrFDdj7ty5UrBaarm4MGDuHbtGpydndGyZUu1KY5SvHfJ398fx44dQ3FxMVxcXODv748uXbpAR0cHt27dkmRXSrmtk9m6dWuEhITA09NTtS0kJESyyzqYm5vjzJkzal2MpbyWblpaGk6ePKmaBvtsczap3oYgt8z169fH/v37cerUKXTp0kUtrxRvp5Fb3metXbsWX3/9NXr16gUHBwcYGRlh9erVmDRpUo0uSGvw4K9QLEiJXkK/fv0QFxcHY2NjLFmyRK2jqhS1b98e8+bNU1t8+6nmzZvj/Pnz1R+qAn369MH58+fRrFmzMiOkUvHsPVRSvJ/qRUaMGCE6QpUUFhZi2bJlcHR0hK6urto+ExMTHDlyRFCy8sltnUw/Pz9MmDAB4eHhsLS0RFpaGvLz8yV5wQoAFixYgEmTJiEyMrJMF2MpsrCwwNixY0XHqBK5Zc7MzETPnj0BALm5ucjNzRUbqAJyy/usR48eqS5sP1W3bl3o6OgISkRyxim7RCRJr2sHP9GkunSRHMlxncyHDx/i+PHjyMzMRNOmTdGrVy9J3u/6lBy7GBPVBKtXr8axY8cwYcIErFq1CkuXLkVwcDBat24NLy8v0fG05m6+NKfsmtSR9xgjC1KilxATEwM7Ozs0aNBAdJRK2bZtG8aPH692D1B8fDwCAgKwZ88egcle3owZM+Dr6yur+x+lRG5LFx0+fBj9+/dXGx1NTEzE/v37sWbNGoHJyifXdTJLS0uRm5uLN954o0Y3J6luDx8+xN69e9VecwBw+fJlhIaGigv2AnLLrFQq8d///rdM3t9//x0BAQECk2kmt7zPevz4MbZs2YKwsDBkZWXBzMwMw4cPx8SJE6GnJ+/i6EVy8ksqfpAADevoVvwgCau5ZwyRFvn7+6umD8rBunXr8K9//UutIG3VqhWSkpIEpvpnTp8+jcLCQtExZGvOnDmoX78+DA0NyyxdJEWzZs3Ce++9p3avq5WVFY4ePSow1YtJsdh8kTt37sDHxwcnT55ESUkJdHV14eLigkWLFsHExER0vDLk1sXYy8sLd+7cAQDo6emhQ4cO2Ldvn2TvKQbkl3nhwoU4d+4cdHR0ULt2bTRv3hxHjx7FoEGDREfTSG55n6Wnp4dp06Zh2rRpoqNQDcCClOgluLu7Y9euXejcuXOZ+9mkJCEhAcCTq7Dnz59XvUlTKpWIi4vTeE8pVV5luuzq6uqiefPmmDt3rqQaNCUlJaktXTR27FhYWFggMDBQUoXUrVu3ADw5ZzMyMlRNP5RKJU6cOIEmTZqIjPdCNjY25Y4wXr58uZrTVMzb2xv6+vo4cOAATE1NkZ6ejoCAAHh7e0vyvkwfHx+kpaXB29tbrYtxVlaWJLsYx8fH4/Dhw7h27Rq2bduGOXPmwMbGRpIjjU/JLfPRo0fx008/ITk5Gfv378eGDRvw7bffqv4WSo3c8j7r6tWrsLa2Vtt248YNrFu3Dl9//bWgVCRXLEiJXkKDBg2Qm5sLV1dXjBkzRu1q/PDhw8UFe87cuXMBPLnv0s/PT/XmWEdHB82bN8fq1atFxpO9ynTZVSqVOHXqFGbPni2pN3FNmjTB6dOn0a9fP1y7dg2FhYVo3bo1rl69KjqamqeFvkKhUHWzBp6c082bN8eSJUsEpnuxZ+91LiwsxMWLF7Fz507MnDlTYKryXbhwAWFhYbCwsAAANGzYEAsWLJDUv2nPklsX47p16yIlJQUdOnTA5cuXUVJSgi5dusDX11d0tHLJLbO+vj7y8/NhZ2eHBQsWAHiyTNu///1vwck0k1veZ33yySfYsGEDOnfujDt37uDrr79GREQERo8eLTqaVvEuBu1gQUr0EoKDg6Gvr4/69esjMjJStV2hUEjqzdvx48cBPBmpCQ8PV5vuSP9cZbvsvvXWW5JbSkUuSxdduXIFwJNzOCEhAXXr1hWcqPKeFnZPvfXWW3BycoKnpyd69+4tKFX5OnfujMjISHh4eKi2HTp0CN27dxeYqnxy62I8efJkeHh44NSpU+jUqRPc3d2hVCrRunVr0dHKJbfMo0ePxkcffYSYmBi0atUKX375JUpKSmBmZiY6mkZyy/usf//735g5cyZ69uyJY8eOYfDgwfjvf/8r6VkrJF1sakT0GvDw8MCmTZtgZGQkOsor07lzZ4SGhkp2zcFnnTt3Dl9//TW+/fZb0VHU3L9/H8bGxigtLVVbukiKFy4GDBiAn376SZL3BlbF33//jSFDhiA2NlZ0lDLc3Nxw8eJFmJubw9TUFBkZGcjOzkaHDh1UnZeldGFFjl2M//jjD7Ro0QKFhYXYvXs38vPzMW7cOEkXIHLLfOLECXTt2hU5OTnYuHEj8vPz4enpCRsbG9HRNJJb3mf9+eefmDRpEvr27auakVXT3XsozaZGb9SW7u1jlcGClEgL5NYBVm55AcDBwQFhYWGyKEhJ+1atWoUpU6aoChEpcHd3V7uHtLS0FMnJyejRo4ck73EMCQl54X6pzQCRaxdjIrnS9Jq7e/cu9u/fj0GDBqF58+YAavbrjgWpdnDKLpEWyK0DrNzyAsDBgwdltd6g1Ir+mrYU0E8//QR3d3dJFaQjRoxQ+1qhUMDU1BRdu3YVlOjFXF1dX7j/gw8+QLdu3SQzJa+iN70zZsxATk6OZF5zcly6SG6Zk5KS0K5dO7ULQb/++iuio6Px5ZdfCkymmdzypqena9w+bNiwF+4nqggLUiKSpIoKJnNzc4Hpqk5qRX9NWwpIipN9nhZ4d+/eRUZGBpo2bSqZ4uhlpKSk4PFjaS4Kr0l8fLykXnNyXLpIbplHjx6NhIQEtbyNGzfGnj17JFngyS2v1KbAU83BgpSIJKmmFUxSwaWAqk9eXh7mzp2L48ePQ19fH8XFxejbty+WL18uyft0axqpXKSQ49JFcswMaP5/fuXKFck2Q5Nb3uf9/PPPOH78ODIyMvDll1/iu+++w4wZM2BoaCg6mtawy652sCAlIklhwaRdXAqo+vj5+aG0tBSxsbFo0qQJsrKy4OfnBz8/P0neQ0raIceli+SW+emavwqFAg4ODmr7atWqhaVLlwpKppnc8mqye/dubNiwAb1798axY8fw2Wef4eLFi1i8eDGWL18uOh7JDAtSIi1QyOwSmpTysmDSrpq6FJCUzuGn4uLi8NNPP6lGk0xNTTF//nyMHDlScDKqTnJcukhumaOjo6FUKtG3b1+Ehoaq/l3T0dFB48aNoacnrbe7csurybZt2/Cf//wHHTp0gIODAwwMDODr64uxY8eyIKUqk/4ZTyRDUpkqVllSysuCqXo4OTnJ4k1PZUnpHH7K3NwcZ86cwahRo1Tbzpw5I9vO0FI7hysitbxvvvmmWnMgOZBL5qdr/urr68PCwkLyfzfkllcTfX39Mq+x0tJS1fTumkoBaf27UlPUnHcjRBIitw6wUszLgkm7tm/fLjrCKxUUFIRGjRqJjqFmwYIFmDRpEiIjI2FlZYWbN2/iwoUL2Lp1q+hoL0Vq53BFpJY3MjJSdIQqk1tmufUYkFveZ40dOxYTJ07E6NGj8fjxYxw5cgQRERH46KOPREcjGdIRHYBIjm7evIlZs2ZBqVTi4sWLGDJkCIYMGYLz588DeDIyoqMjnZfXtm3bUFxcrLYtPj4e7u7uAKSXF3hSMBkZGYmO8cocPHhQUgvJV3QOS01xcTGCgoLg5uaGHj16IDk5GaNGjUJqaioAoFOnTjAwMBCcUp2DgwMOHz6MLl26QKFQoEuXLoiMjIS9vb3oaOUqKipCRkYGbt26pfYBPLm/W06ju1J7zd2/fx/r168HAKSmpmLq1KmYMmUKrl+/LjhZ+eSWubi4GD/88AMAICcnB0uXLoW/vz9u374tOJlmcsv7LA8PD3h7e+PixYswNzdHXFwcxo0bhwkTJoiORjKkUErtEiKRDIwdOxZvv/02Fi9ejLFjx6JTp07Q0dFBTEwMDh48KDpeGW3atCnTWv727dtwcXHBr7/+KjBZ+aKiorBy5UpkZGSotimVSigUCly+fFlgMs3ktq6n3M7hhQsX4vfff8fo0aOxatUqhIWFYdeuXbh27Rq++eYb0fFqhD179mDNmjUoLi5WG13ka+7VmDhxIvT09BAYGAgPDw80bNgQOjo6uHHjBr7//nvR8TSSW+ZZs2YhNTUVBw4cwBdffIH79++rmgft2LFDdLwy5JaXgL8LS0VH0KiekbQGFapMSURV1qFDB2VmZqYyLy9PaWtrqywuLlZmZWUpO3ToIDqamnPnzinPnTuntLa2Vp44cUL19dmzZ5Vr165VDh06VHTEcjk6OipXr16tTElJUaalpal9SJGNjY3ywYMHatuys7OV7du3F5ToxeRyDj9lb2+vTE1NVX2enp6uvHnzptLW1lZwsvJlZmYqp02bpjxx4oRSqVQqhw8frpwwYYIyOztbcDLNHBwclLt371YWFRWJjlIpcnvN2draKm/duqUsLCxU2traKgsKCiT9mlMq5Ze5U6dOytTUVGVRUZGyY8eOyr///luZkZEh2X8n5Jb3eQcPHlR+8cUXytGjRytTUlKUn3/+ufLu3buiY2nV/YISSX7IXc25QYuoGjVt2hSRkZF49OgR7OzsoKenJ8lmJXLuWKtQKDB69Gg0a9ZMdJQXkusyNXI5h58yMzNDYmIirKysVNtSU1NhaWkpMNWLLVq0CHXr1oWNjQ2AJ2vrBgUFwdfXFwEBAYLTlWVsbAxHR0e1EUcpkutr7o033sAvv/yCR48ewcbGBkZGRkhISICJiYnoaOWSW2YjIyNkZ2cjLS0NzZs3R926dZGcnCzZpkFyy/us9evXIywsDEOHDsWJEydUt/34+vpi48aNgtOR3HDKLtFLOHXqFObNmwcjIyOsW7cO+fn5mDx5MtauXYt+/fqJjleGjY0NEhMTZfFH7qkDBw4gKioKq1atQsOGDUXHKZezszMAICMjA2ZmZmWKfi8vL1hbW4uMqJHczuGTJ09i2rRpeOedd3Dp0iX06dMH58+fx8qVK+Hk5CQ6nkYdO3ZEZGSkWsOwzMxMDB48GImJiQKTaXb8+HFs27YNixcvRuvWrUXHKZdcX3NhYWFYsGAB9PX1sWHDBtSrVw/jx4/HvHnz8K9//Ut0PI3klnnHjh1Yt24dFAoFli5ditatW2PixIkYM2YMPvvsM9HxypBb3mc5Ojpiz549aNWqFRwcHBAWFobi4mKMGDFCsr0IXoUHEp2yW1fmU3ZZkBK9AgUFBZJud+7h4YFNmzbJqkmQu7s7rl27hoKCArRs2VKtmN69e7fAZJrJseh/ltTPYeDJiOihQ4eQlZUFMzMzDBo0SG3EVGqGDh2KTz/9FMOHD1dtCw0Nxc6dOyV5n66zszNyc3NRUFCAevXqqZ3L0dHRApNpJsfX3MOHD6GrqwtDQ0Pk5ubi3r17ePPNN0XHeiG5Zf7zzz9haGgICwsLZGVl4dq1a+jevbvoWOWSW96n+vfvjwULFuC9995TFaS3b9+Gl5cXjhw5Ijqe1rAg1Q4WpEQkSSEhIeXuc3V1rcYklSPHop+0Kz4+Hp6ennBwcICFhQXS0tKQmJiIgIAAODo6io5Xxrlz58rd17lz52pMUjl8zRGJExoaikWLFqFfv344duwYxowZg+joaEyfPl3tIlxNw4JUO1iQEr0G5Naxluh5WVlZ8Pf3h5ubG3r27AlXV1c0atQIy5cvR+PGjUXHK1d6ejoiIiKQmZkJc3NzDBo0CBYWFqJjvVBSUhIyMjJgbm6O9u3bi45DRBKVmJiI0NBQ1ayVYcOGSXpZq1fhwSOJFqSGLEiJSOK6desGV1dXuLm5lWlYItU3xzY2Nqp7w54nxSKaRb92TZo0CXXr1oWXlxdMTU2RkpKCoKAgPHjwQJINgipjxowZ8PX1lcw90llZWZg6dSr++usvNGnSBNnZ2WjRogUCAgLU7oOVCr7miMQ5duwY2rRpI9n3ENrCglQ7WJASVdKza3lqKpak/Eaoe/fu2Ldvn+Q71j4rPT1d9XlhYSEuXryInTt3YubMmejdu7fAZJrJoeiX8zkstwZBlfH0viupdDaePHkyTE1NsXDhQhgYGODRo0dYtmwZMjMzsXXrVtHxypDDa65Pnz44ePAg6tSpA2dn53IvsknpHl25Zf7444+xZcsW1KpVC+7u7uXmlUrvAbnlLc+oUaOQmpoKhUKBtm3bok2bNnjnnXfQtm1bSd9j/E+xINUOLvtCVEnHjh1TNc+Qyh/iyvriiy/g7+8v+Y61z3r+DeVbb70FJycneHp6SrIglcMyNXI+hy0tLREfH692b5KUl6mRo/PnzyM8PBwGBgYAAENDQ0yZMgVDhw4VnEwzObzmVqxYgVq1agEAVq5cKThN5cgts6urq+qCxIgRIwSnqZjc8pbnxx9/BABcuXIFMTExOHbsGHbu3CnZi5qvigKaLyDQP8MRUqLXgNw61pbn77//xpAhQxAbGys6ShlyWaZGruTWIKgypDZCOnbsWNVFn6c2b96MU6dOYd++fQKTacbXHJE4bm5uqFu3LszMzNCiRQs0a9YMLVq0QPPmzVUXNGqivEfSLJuMDeVdKHOElKiK/v77b1y+fBl3794FAJiYmOCdd96R9NIDcrwK+/xUptLSUiQnJ6NHjx4CU5Xv4MGDuHbtGpydnSVf9MvxHHZ0dER4eDgOHTqEzMxMODg4wM/PTzJTM2sCPz8/TJgwAeHh4bC0tERaWhry8/OxY8cO0dE0ktNrjqimsbW1RVpaGrKzs3H//n3cu3cP9+/fx99//y3JrtwkbRwhJaqk4uJiLFmyRLUcyRtvvAGFQoF79+5BR0cHH374Iby8vASnrDmeX/ZFoVDA1NQUXbt2LfeeG5HksEwNz2Fp6dy5M0JDQyUzQgo8WXPy+PHjyMzMRNOmTdGrVy/Url1bdCyN5PCaI6qpHj9+jJs3byIlJQVXrlxBdHQ0fvvtN9SvXx9nz54VHU9r8oukWTbVMZDe+6Kq4AgpUSVt2LABsbGxCAoKgqOjI3R1dQE8Gbk7e/Ys5s+fjwYNGmDSpEmCk5Ylt461wP+9obx79y4yMjLQtGlTSU/Lk8MbYDmfwzWxo6oUrwfXrl0bAwcORG5uruqChVSV95orKiqq5iTle1FToGdJ6Z5uuWV+UWOgZ0ll1FxuecvToUMHmJiYoG3btrCxscHkyZPRpk0bWFlZiY5GMsQRUqJK6t27NxYtWgRnZ2eN+2NiYrB8+XIcPXq0mpNVTG4dawEgLy8Pc+fOxfHjx6Gvr4/i4mL07dsXy5cvl+TUUjkU/XI+h+XQUbWqMjIyYGpqCh0daXRHvHPnDnx8fHDy5EmUlJRAV1cXLi4uWLRoEUxMTETHKyM7OxuBgYG4ceMGSkpKADwp8lNSUnDq1CnB6Z44d+6c6vO4uDhERkZiwoQJsLKywq1bt7Bjxw707NkT8+fPF5hSndwyPztS/ttvvyE8PBxubm6qvAcOHICLiwuWLFkiMOX/kVve8ty5cweNGjUqd/+qVaswZcoU1K9fvxpTaR9HSLVESUSV0rZtW+Xdu3fL3X/nzh1l27ZtqzHRP3P79m2lm5ub6BjlmjVrlnLKlCnKrKwspVKpVGZmZiqnTJminDVrluBkmqWlpak+rl27pgwJCVEOGTJEefz4cdHRVOR8Dnfr1k35119/iY5RJZmZmcpp06YpT5w4oVQqlcrhw4crPTw8lNnZ2YKTaebh4aGcOnWq8vfff1fevXtXmZSUpJwyZYpy4sSJoqNp9PHHHys/++wz5eTJk5UTJ05Ufvfdd8ru3bsrN27cKDqaRj169FD+8ccfatv++OMPZe/evQUlqpjcMvfr10954cIFtW2//PKLcsCAAWICVUBueavCwcFBmZ6eLjrGK5f/qFSSH3LHKbtElVRSUoLx48erpjk+7/Hjxygtleb6VJoYGBggKytLdIxyxcXF4aeffkKTJk0AAKamppg/fz5GjhwpOJlmclimRs7nsByXLlq0aBHq1q0LGxsbAMC6desQFBQEX19fBAQECE5X1oULFxAWFqY6lxs2bIgFCxaoLbUjJUlJSTh69ChSUlKwbt06jB07FhYWFggMDMT06dNFxytDoVAgLS0Nb7/9tmrbrVu38PjxY4GpXkxumf/++2/VaPlTpaWlyM3NFROoAnLLWxVKTsCkKmBBSlRJK1asEB3hpcmtYy0AmJub48yZMxg1apRqm9zWnZRa0S/nc1iOHVUTExMRGRkJU1NTAMCbb76JmTNnYvDgwYKTada5c2dERkbCw8NDte3QoUPo3r27wFTla9KkCU6fPo1+/frh2rVrKCwsROvWrXH16lXR0TSaPn06ZsyYge7du8Pc3BzZ2dk4deoU5s2bJzpaueSW+aOPPoKnpyeGDBmiyhseHo6xY8eKjqaR3PISaQvvISV6DcitYy0AJCQkYNKkSejYsSOsrKxw8+ZNXLhwAVu3boW9vb3oeGW8qOhfu3atwGQ1gxw7qg4dOhSffvqp2ghjaGgodu7ciYMHD4oLVg43NzdcvHgR5ubmMDU1RUZGBrKysmBrawsDAwMA0ir+o6KiMHv2bJw4cQJr1qxBYmIiAKBZs2aSXarmypUrOHbsGG7fvg0TExP06dMH77zzjuhYLyS3zNHR0WXy9uvXT3Sscsktb2VJbZ3lV+VhsTTLptr6//y93B9//AFvb2+kpqZi1KhR8PLyqtR7xP3792Pjxo24d+8eunTpgpUrV6pmt1UWC1Ki14hcOtY+lZGRgfDwcGRkZMDc3BzDhg1TjTZJjRyL/pqgqKhIVSxJTXx8PDw9PeHg4AALCwukpaUhMTERAQEBcHR0FB2vjBcV/U9Jrfi/f/8+6tSpA6VSifDwcBQUFGDYsGGSbHxWkRkzZsDX11cW/zY/JbfMcmu0I7e8z5LislavQk0tSIuKivD+++/DyckJHh4eWLp0Kfr371/hbVKJiYn4/PPPsXbtWrRs2RKzZs2CmZkZvvrqqyr9fBakRK8BuXWslTO5Ff1yIYeOqpqkpaXh0KFDyMzMhLm5OQYNGiTZrsC3bt0qd19Ne1MpRXIcUZJbZrkVSXLL+yy5nRuVVVML0mPHjmH+/PmIjY1FrVq1cOXKFSxevBj79u174XEHDhxA/fr1VaP6P/30E7Zu3YojR45U6efzHlKi14Cfnx9KS0sRGxuLJk2aICsrC35+fvDz85PsdNKsrCz4+/vDzc0NPXv2hKurK0xMTLBixQo0btxYdLwyWPRr15w5c1C/fn0YGhqitLQUvXr1QkBAAMaMGSM62gtZWlpi8uTJKCoqgp6etP/kPl1/Uvn/13d9llSWLnqWprVpn5JiXhJPbmMwcsv7rKCgoBcuCyNXCkhzxlNRUVGZNZgNDAwqPYPoypUr6NChA2rVqgUAsLa2xvXr1ys8zs3NTe3rlJQUNG/evJKp/480Fj8jIq2Ki4vDggULynSsPXnypOBk5Vu0aBEMDQ3VOpSamJjA19dXcDLNni36k5KScOLECRQXF8PPz090tBohKSkJPj4+mDBhAh48eICxY8di2bJlkh4dzcvLw6JFi9CtWzfY2trijz/+wHvvvYdLly6JjqbRlStXcPnyZVy5cgUXLlzA7t270blzZ3zzzTeio2nk5+eHAQMGIDIyEseOHVP7ICLtys3Nxfr16wEAqampmDp1KqZMmaIqYjp16iTZ2ylqoi1btqBTp05qH1u2bCnzOE9PT9jb25f52LNnDywtLVWPUygU0NHRwf379yud4d69e9i/f/9LNeWS9uVaInol5NixVm4dSuW2TI3cyK2jKgDMnz8fBQUFWLVqFb744gvUrVsX7u7uWLJkCX744QfR8V7IyMgIDg4OCAwMxEcffYTg4GDRkcpQKBQYPXo0mjVrJjoK0Wtnzpw5qlkfS5YsQcOGDaGjo4MFCxbg+++/F5zu9TN58mR88sknats0XRBYsmQJCgsLy2zfvXt3mZkxhoaGKCwsrPQ9zIsXL4adnR169epV+eD/HwtSotfAggULMGnSJERGRpbpWCtVlpaWiI+PV+tQKuUiWo5Fv5zMmjULs2fPhpOTE1xcXDBkyBAAQMeOHQUnK9/p06cREREBMzMz6OjoQKFQYNiwYQgKChIdrdLu3r2L7Oxs0TE0kuPatC8ix+ZncsvMvK9OYmIiDh8+jEePHuH8+fOIj4/H33//XSM6BL+IVP+XGOhXbnpuedOoGzVqhOTkZLVt+fn50NfXr9TP//HHH5GYmIjQ0NBKPf55LEiJXgMODg44fPiwqmNtly5dsHz5csl2rAUAb29veHp64vDhw2U6lEqRHIt+OenXrx/i4uJgbGyMJUuWICIiAg8fPsSwYcNERytXy5YtERISgqlTp0KhUEChUODChQt4++23RUfT6Ok9pE+Vlpbi9u3b+PjjjwWmUvf88krJycmyWpv2ReR4v6DcMjPvq/PGG2/gl19+waNHj2BjYwMjIyMkJCTAxMREdDR6Ce3atcOPP/6o+jotLQ1FRUWVGh1NSkrC8uXL/9F9w+yyS0SSJacOpYC8lqkh7UtKSsKkSZOgr6+PnJwctGvXDunp6QgMDMS7774rOl4Z586dU/taoVDAzMwMVlZWghKVVZmlaQDpLU9TGRkZGTA1NYWOjnzae8gt8/nz59GuXTvZ3Nso5bxhYWFYsGAB9PX1sWHDBtSrVw/jx4/HvHnz8K9//Ut0PK0pfCw6gWZG/3CI8fHjx+jRowfmzp2L4cOHw8fHB9nZ2aoZPXl5eTA0NCwzYnrnzh0MHToU7u7uahcv69SpU6Wfz4KU6DUgt461RM/btm0bxo8fr/bHMD4+HgEBAdizZ4/AZC/24MEDxMTEICsrC2ZmZujVqxfq1q0rOtYLJSUlqS6qtG/fXnScGkNTV+CnHY2l2hV49uzZmDdvntqox5UrV+Dr64v9+/cLTKbZ+fPnsWHDBmRkZJQZXYyOjhaUqnxyy/u8hw8fQldXF4aGhsjNzcW9e/fw5ptvio5FL+nYsWOYNWsW6tSpg5KSEnz77beqGT3Ozs6YP38+XFxc1I755ptvsGLFijLfq6r9HViQEr0GJk2ahLp168LLywumpqZISUlBUFAQHjx4INkpsDdv3sSGDRuwdu1aXLp0CQsWLIBSqYSvry/s7e1FxyuDRb92tWnTBgkJCWrTMm/fvg0XFxf8+uuvApOV77vvvoOLi4tsRsmzsrIwdepU/PXXX2jSpAmys7PRokULBAQESPI5aHrNNWrUCMuXL5fka65bt25wdXWFm5tbmVEGqc788Pb2xvHjxzF16lSMGjUKmzdvxoEDBzBx4kRMnjxZdLwynJ2dYWdnhxEjRpT5HXfu3FlQqvLJLS/VfFlZWbh48SI6duxYrffmsyAleg107NhRrWMtAGRmZmLw4MFITEwUmKx8Y8eOxdtvv43Fixdj7Nix6NSpE3R0dBATE4ODBw+KjleGHIt+OUhISADw5N7BLVu2oHbt2gCejCzFxcXh5MmTCAsLExmxXO+//z7mz5+P9957T3SUSpk8eTJMTU2xcOFCGBgY4NGjR1i2bBkyMzMleS+03F5z3bt3x759+2TXFfjatWuYO3curl69ik6dOmH16tWSvEABPOmXEBISorZ8hZTJLS+RtrAgJXoNDB06FJ9++qlax9rQ0FDs3LlTksUdANja2uLIkSMwNjaGk5MTEhISkJOTg379+uGXX34RHa8MORb9cuDs7Azgyb1qZmZmqoY2Ojo6aN68Oby8vGBtbS0yYrkOHjyIffv2Yfv27VW+n0YEe3t7hIeHw9zcXLXt1q1bGDp0qCTPYbm95g4cOICoqChZdQXOyMjAv//9b/zvf//DgAEDEBYWhg8++ABTpkyR5Dm9efNm3Lx5E/7+/pXuDiqS3PI6ODhUqvPv8/ejE1WEXXaJXgNy61gLAE2bNkVkZCQePXoEOzs76OnpSXoZFbktUyMXx48fBwDY2NggPDxcbcqu1KWmpkKpVKJ///4YNmwYatWqpdo3ffp0gck0a926NUJCQuDp6anaFhISItmuwHJ7zR08eBDXrl2TVVfggQMHYtSoUYiMjISxsTHGjx+PJUuWoH///jh16pToeGWkpaXh5MmTqqmwzxbNmu5zE01ueTdv3iw6AtVQHCElek3IrWPtqVOnMG/ePBgZGWHdunXIz8/H5MmTsXbtWkmucxYfHw9PT084ODiUKfodHR1Fx5M9Dw8PbNq0CUZGRqKjVJq3t3e5+6T4ZjM5ORmffvopjI2NYWlpiZs3byI/Px87d+6UZFEqt9fcizoES7Ur8JUrV2BjY1Nm+5EjR9C/f38BiV5s06ZN5e6T4kUgueUl0hYWpEQkCwUFBSgtLZXkNLGn5Fb0EwFAUVER4uPjUbduXdjY2CAmJgYpKSlo0aIFevXqJelR6fT0dERERPA1V82KiookuRQJEckTC1Ki14DcOtYSPe/5c3j+/PkAAD8/P3Tq1ElwOvm6dOkSpk6dCn19fXz44YeYMGECAGDMmDFIS0tDSUkJtm/fjnfeeUdwUhIhOzsbgYGBuHHjBkpKSgA8aSiWkpIiySm7Dx8+xN69e9XyAsDly5cRGhoqLlg55JaXSFvksZIxEf0jc+fOhbGxMRQKBVasWIGePXvC2dkZS5YsER2txrh58yZmzZoFpVKJixcvYujQoRgyZIgkm6vI0fPncK9eveDs7IzFixeLjiZrPj4+mDp1Ko4fP64qRgHg+++/x6lTp+Du7g4fHx+BCcsXExOD3Nxc0TFqtDlz5uDu3bswNDSEkZER3n//faSkpGDMmDGio2nk5eWFY8eO4dq1a7h58yYaNmyII0eOoEuXLqKjaSS3vETawqZGRK+B33//HevXr0d+fj4uX76M3bt3IycnB7t27RIdrcaYO3cu3n77bbWiX0dHB0uWLJFsJ2M54TmsHSkpKXBycip3/5AhQyS55AsA+Pv7Y9myZZK8X/SpPn364ODBg6hTpw6cnZ3L7VAaHR1dzckqJykpCUePHkVKSgrWrVuHsWPHwsLCAoGBgZK8xzE+Ph6HDx/GtWvXsG3bNsyZMwc2NjaSHW2UW14ibWFBSvQakEvH2jZt2iAhIQHGxsawsbEp8+ZNqVRCoVDg8uXLghKWjwWTdsnlHJabHj16YOnSpVixYgVMTEzU9uXn52PDhg3o3LmzoHQv5u7ujl27dqFz587Q1dUVHUejFStWqLorr1y5UnCaqmvSpAlOnz6Nfv364dq1aygsLETr1q1x9epV0dE0qlu3LlJSUtChQwdcvnwZJSUl6NKlC3x9fUVH00hueYm0hQUp0Wtg/vz5ah1r4+PjsXDhQqxdu1Z0NDXHjh1TNVCR6ohBeVgwaZdczmG5WbZsGebNm4cePXrAysoKJiYm0NXVxf3793Hjxg20atUKQUFBomNq1KBBA+Tm5sLV1RVjxoxB7dq1VfueXQpGpGeLeakW9i8ya9YszJ49G05OTnBxccGQIUMAPFkDVoomT54MDw8PnDp1Cp06dYK7uzuUSiVat24tOppGcstLpC1sakT0GpJDx1q5kdsyNXLHc/jVSktLw88//4ysrCw8fvwY9erVQ5s2bSRbeABPRkg1USgUkl3XU47u378PY2NjlJaWIiIiAg8fPsTw4cMl+9r7448/0KJFCxQWFmL37t3Iz8/HuHHjYGZmJjqaRnLLS6QNLEiJSHL+/vtvXL58GXfv3gUAmJiY4J133pH08hPPY8FERM/6/fffERcXh+Li4jL7pHg/JiDPzEQkP5yyS0SSUVxcjCVLlqgWkH/jjTegUChw79496Ojo4MMPP4SXl5fglJXz9L4xItK+oqIi6OvrQ6lUQkdHmgsITJgwAa1atYKlpaXoKJUmt8zFxcXYsWMHoqOjkZmZiZ07d8Lb2xvr1q1Ds2bNRMcjonKwICUiydiwYQNiY2MRFBQER0dHVaOS0tJSnD17FvPnz0eDBg0wadIkwUmJSLS8vDysWrUK0dHRyM3NRXBwMDw8PBAUFIR3331XdLwy7OzsMGLECLi4uIiOUmlyy7x48WL8/vvvGD16NFatWgUjIyPY2trCx8cH33zzjeh4RFQOTtklqqHk2LG2d+/eWLRoEZydnTXuj4mJwfLly3H06NFqTkYiyPEcpurz+eefo6CgAB9//DG++OILHDx4EBEREYiOjsYPP/wgOl4Za9euxfbt29GoUSMYGhqq7ZNqEze5ZXZwcEBwcDCsrKzg4OCAsLAwlJaWYsiQIbhw4YLoeACAjz/+GFu2bEGtWrXg7u5e7lJAvA+aXiccISWqoeTYsTY7Oxu2trbl7m/fvj1u3bpVfYEqwIJJu+R4DlP1OX36NCIiImBmZgYdHR0oFAoMGzZMsl2BQ0ND4ePjg1atWomOUmlyy2xmZobExERYWVmptqWmpkpqyrGrqyv09fUBACNGjBCchkgaWJAS1VAWFhYaP5eykpISjB8/vtw1BR8/fozS0tJqTlU+FkzaJcdzmKpPy5YtERISgqlTp0KhUEChUODChQt4++23RUfTqE+fPjh//jyaNWtWZrRRquSWec6cOZg2bRr279+PgoICrFq1CufPn5fUGrCurq4aPyd6nXHKLlENJ6eOtU+bGVWEf8RfL3I6h6n6XLx4ERMnToS+vj5ycnLQrl07pKenIzAwUJL3kJZ3K4JCoZDsBS05Zr558yYiIiKQlZUFc3NzDBw4UG3ElIikhwUpUQ1VkzrWSh0LJu3gOUzPCw0NVfv6/v37ePjwIfT09FBSUoJatWqhfv36GD58uJB8/8SMGTPg6+uLhg0bio5SaVLLzGVqiOSJU3aJaih2rNU+FkzaxXOYnjdv3jwoFAro6uqibdu2MDIyUu17en1doVDIsiA9ffo0CgsLRceoEqlllsMyNS9qZPQsNjWi1wkLUqIa6vDhw/Dz84OTk5Padh0dHTg6OsLHxwfLly/nm/l/gAWTdvEcpuctWrQI169fR3JyMv7880/UrVsX1tbWsLGxgbW1NaytrXm/8WtMDsvUPNvI6LfffkN4eDjc3NxgZWWFW7du4cCBA5LOT6QNLEiJaii5dayVIxZM2sVzmJ734Ycfqn2dnZ2NmJgYREZG4uuvvwYAGBsbIyEhQUQ8Eqxly5aYPn26pJepebYHQlBQELZs2aL275yzszO8vb0FJCMShwUpUQ0lt461csSCSbt4DtPzYmNjkZycjGvXriE5ORnp6emwtLSEtbU15s2bpxotpdeT3Jap+fvvv1FSUqK2rbS0FLm5uWICEQnCgpSohlqxYoXoCDUeCybt4jlMz5s8eTIUCgV0dHTw7rvv4r333oOuri5KS0tx5coVXLlyBWFhYbI8dypzX6HUSC2z3Jap+eijj+Dp6YkhQ4bA3Nwc2dnZCA8Px9ixY0VHI6pWLEiJaigujaJ9cnzTKyc8h+l506ZNk1wR9KrIcdEDqWWOi4sDAFy4cEFtu1SXqZk2bRpsbGxw7NgxxMfHw8TEBH5+fujXr5/oaETVisu+EBEREQmWkZEBU1NT6OjoiI5SaXLLLLVlaojoCXn8C0JEREQkY9u2bSuzPmZ8fDzc3d0BAObm5pIr7OSY+UWktkxNcXExgoKC8MEHH6BHjx5ITk7GqFGjkJqaKjoaUbWSz78iRERERDK1bt06PHr0SG1bq1atkJSUJChRxeSYWU4WL16MqKgojBw5Evn5+TAyMoKtrS18fHxERyOqVryHlIiIiEhLni5Bo1Qqcf78edSuXVv1dVxcHFq0aCEwnWZyzCxHR44cQXBwMKysrLB27Vro6upi/PjxGDJkiOhoRNWKBSkRERGRlsydOxfAk8Y6fn5+qqZMOjo6aN68OVavXi0ynkZyzCxHZmZmSExMhJWVlWpbamoqLC0tBaYiqn5sakRERESkZTY2NkhMTISxsbHoKJUmx8wv0rlzZ4SGhqJp06aiowAATp48iWnTpuGdd97BpUuXVMvWrFy5Ek5OTqLjEVUbjpASERERaZmTkxP09OT1tkuOmV9EamMw7733Hg4fPoyIiAjY2NjA3Nwcs2fPVhsxJXodcISUiIiIiGo8qS1T8/vvvyMuLq5MJ2MAmD59uoBERGLUnMteRERERBIVFRWFlStXIiMjQ7VNqVRCoVDg8uXLApOVT26Zt23bhvHjx0NfX1+1LT4+HgEBAdizZw/Mzc0FpitrwoQJaNWqFe8ZpdceR0iJiIiItKxbt25wdXWFm5ubWsEEABYWFoJSvZjcMrdp0wYJCQlq97zevn0bLi4u+PXXXwUm08zT0xMjRoyAi4uL6ChEQnGElIiIiEjLFAoFRo8ejWbNmomOUmlyySzXZWpatmyJ6dOno1GjRjA0NFTbFx0dLSgVUfXjCCkRERGRlh04cABRUVFYtWoVGjZsKDpOpcgls7OzM4An94iamZmVWabGy8sL1tbWIiNq5OTkBE9PT7Rq1arMvs6dOwtIRCQGC1IiIiIiLXN3d8e1a9dQUFCAli1bqk0r3b17t8Bk5ZNbZrktU+Pr64u8vDy4urqWGSF1cHAQlIqo+nHKLhEREZGWjRgxQnSEKpNbZrktUxMXFwcAuHDhgtp2hULBKbv0WuEIKREREZEgRUVFMDAwEB2jSuSYWY5mzJgBX19fSU+XJnoV5HMZiYiIiEimsrOzERgYiBs3bqCkpATAk6Y7KSkpOHXqlOB0mskts9yWqanI6dOnUVhYKDoGkdaxICUiIiLSsjlz5qB+/fowNDREaWkpevXqhYCAAIwZM0Z0tHLJLbOfn1+5y9QQkXSxICUiIiLSsqSkJBw9ehQpKSlYt24dxo4dCwsLCwQGBmL69Omi42kkt8xyWaaGiNTpiA5AREREVNM1adIEp0+fRrt27XDt2jUUFhaidevWuHr1quho5ZJb5i+++AL+/v7IyckRHYWIqoAjpERERERaNmvWLMyePRtOTk5wcXHBkCFDAAAdO3YUnKx8cst88OBBXLt2Dc7OzrJYpqYiT9dTJarp2GWXiIiIqBrcv38fderUgVKpRHh4OAoKCjBs2DBJr5spp8whISHl7nN1da3GJK+Gg4MDwsLC0LRpU9FRiLSKBSkRERER1VhyXaYmIyMDpqam0NHhHXZUs7EgJSIiItIyTUuSPCXVJUnkllluy9Rs27YN48ePV+sIHB8fj4CAAOzZs0dgMqLqxYKUiIiISMu6detW7pIkFhYWglK9mNwyjxs3DvXr10dRUVGZZWqk2BW4TZs2SEhIUJv+fPv2bbi4uODXX38VmIyoerGpEREREZGWyXFJErlllssyNQkJCQCejN6eP38etWvXVn0dFxeHFi1aCExHVP04QkpERESkZQcOHEBUVBRWrVqFhg0bio5TKXLL3L9/f0ybNg39+vVDjx49EBcXh3v37mHgwIG4cOGC6Hgqzs7OAJ7cI2pmZqbqpqujo4PmzZvDy8sL1tbWIiMSVSsWpERERERa4O7urrZ0R3JyMgoKCiS9JIkcMz8VFRWF2bNn48SJE1izZg0SExMBAM2aNcOOHTsEpyvLxsYGiYmJkuxYTFSdOGWXiIiISAtGjBghOkKVyTHzU/369UNcXBzq1KmDJUuWqC1TI0VOTk7Q0+NbcSKOkBIREREREZEQXNiIiIiISMuysrIwffp0xMbGAgBcXV0xceJE3L59W3Cy8sktc1RUFJydndGmTZsyH1KkKa+NjY1k8xJpC0dIiYiIiLRs0qRJqFu3Lry8vGBqaoqUlBQEBQXhwYMHCAgIEB1PI7llltsyNXLLS6QtLEiJiIiItKxjx46IjIyEqampaltmZiYGDx6sar4jNXLL3L17d+zbt082y9TILS+RtnDKLhEREZGWWVpaIj4+Xm3bmTNn0LRpU0GJKia3zF988QX8/f2Rk5MjOkqlyC0vkbZwhJSIiIhIy+Lj4+Hp6QkHBwdYWFggLS0NiYmJCAgIgKOjo+h4Gskhs5yXqXF3d8e1a9dkk5dIW1iQEhEREVWD9PR0REREIDMzE+bm5hg0aJDk7xWUeuaQkJBKPc7V1VXLSaruRdmlmJdIW1iQEhERERFJRFFREQwMDETHIKo2XI2XiIiISMtiYmJgZ2eHBg0aiI5SaXLLnJWVBX9/f7i5uaFnz55wdXVFo0aNsHz5cjRu3Fh0vDKys7MRGBiIGzduoKSkBACgVCqRkpKCU6dOCU5HVH3Y1IiIiIhIy/z9/XH58mXRMapEbpkXLVoEQ0ND2NjYAADWrVuHhg0bwtfXV3AyzebMmYO7d+/C0NAQRkZGeP/995GSkoIxY8aIjkZUrViQEhEREWmZu7s7du3apRoJkwO5ZU5MTFStmQoAb775JmbOnIlz584JTqZZUlISfHx8MGHCBDx48ABjx47FsmXLODpKrx1O2SUiIiLSsgYNGiA3Nxeurq4YM2YMateurdo3fPhwccFeQG6Zny5T82w2KS9T06RJE5w+fRr9+vXDtWvXUFhYiNatW+Pq1auioxFVKzY1IiIiItIyd3d3jdsVCoVkl/iQW2Y5LFPzrKioKMyePRsnTpzAmjVrkJiYCABo1qwZduzYITgdUfVhQUpERERENYLUl6l53v3791GnTh0olUqEh4ejoKAAw4YNU1uTlKimY0FKREREVI2Kioqgr68PpVIJHR15tPOQY2Yikgf+i0JERESkZXl5eVi0aBG6desGW1tbXL16Fe+99x4uXbokOlq55JY5JiYGubm5omNUWlRUFJydndGmTZsyH0SvExakRERERFo2f/58ZGZmYtWqVahVqxbq1q0Ld3d3LFmyRHS0cskts9yWqfHz88OAAQMQGRmJY8eOqX0QvU7YZZeIiIhIy06fPo2IiAiYmZlBR0cHCoUCw4YNQ1BQkOho5ZJb5qfL1HTu3Bm6urqi41RIoVBg9OjRaNasmegoREJxhJSIiIhIy1q2bImQkBC1bRcuXMDbb78tKFHF5Jb52WVq9u7di9DQUNWHFH3xxRfw9/dHTk6O6ChEQrGpEREREZGWXbx4ERMnToS+vj7u3buHd999F+np6QgMDMS7774rOp5Gcsssh2Vq3N3doVAoVF8nJyejoKAALVu2VOusK5W8RNWBBSkRERGRlsXGxuLYsWMIDg6Gnp4eSkpK0LNnT9SrVw8rVqwQHU8jOWaWuudHnMvj6uqq5SRE0sGClIiIiEjLHBwc0Lt3b433C06fPl1AoorJMfNTXKaGSD7Y1IiIiIhIywYMGABra2u4ubnBwMBAdJxKkVvmvLw8rFq1CtHR0cjNzUVwcDA8PDwQFBQkySnGWVlZ8Pf3h5ubG3r27AlXV1c0atQIy5cvR+PGjUXHI6o2vGREREREpGXFxcXw9/dHhw4dVGtN2tjYSHrNSbllltsyNYsWLYKhoSFsbGwAAOvWrUPDhg3h6+srOBlR9eIIKREREZGWxcfHY/PmzariQw7kllluy9QkJiYiMjISpqamAIA333wTM2fOxODBgwUnI6peLEiJiIiItMzR0RHffPMNBg8eDENDQ7V9FhYWglK9mNwyP12mZurUqaptUl6mxtLSEvHx8Rg+fLhq25kzZ9C0aVNxoYgEYFMjIiIiIi2Tw5Ikz5NbZrktUxMfHw9PT084ODjAwsICaWlpSExMREBAABwdHUXHI6o2LEiJiIiISPbkuExNeno6IiIikJmZCXNzcwwaNEiSo89E2sSClIiIiIhkT87L1BC9zngPKRERERHJntyWqYmJiYGdnR0aNGggOgqRUBwhJSIiIiLZ8/b2RkhICBQKhWqbUqmEQqHA5cuXBSbTzNnZGcuWLeP9ovTa4wgpEREREcme3JapcXd3x65du9C5c2fo6uqKjkMkDAtSIiIiIpI9uS1T06BBA+Tm5sLV1RVjxoxB7dq1VfueXQqGqKbjlF0iIiIikj25LVMjt7xE2sKClIiIiIiIiITQER2AiIiIiOh1VlRUBKVSidLSUtFRiKodC1IiIiIiomqWl5eHRYsWoVu3brC1tcXVq1fx3nvv4dKlS6KjEVUrFqRERERERNVs/vz5yMzMxKpVq1CrVi3UrVsX7u7uWLJkiehoRNWKXXaJiIiIiKrZ6dOnERERATMzM+jo6EChUGDYsGEICgoSHY2oWnGElIiIiIiomrVs2RIhISFq2y5cuIC3335bUCIiMdhll4iIiIioml28eBETJ06Evr4+7t27h3fffRfp6ekIDAzEu+++KzoeUbXhCCkRERERUTXLyclB3759kZOTA11dXVy6dAnt27fHd999JzoaUbXiCCkRERERUTVzcHBA79690axZszL7pk+fLiARkRhsakREREREVM0GDBgAa2truLm5wcDAQHQcImE4QkpEREREVM28vb0REhIChUKh2qZUKqFQKHD58mWByYiqF0dIiYiIiIiqWXx8PDZv3gwbGxvRUYiEYkFKRERERFTNHB0d8c0332Dw4MEwNDRU22dhYSEoFVH1Y0FKRERERFTN0tLSAAARERFq2xUKBYYPHy4gEZEYvIeUiIiIiIiIhOA6pERERERERCQEC1IiIiIiIiISggUpERERERERCcGClIiIiIiIiIRgQUpERERERERCsCAlIiIiIiIiIViQEhERERERkRAsSImIiIiIiEiI/wfJwtMgdY9m3AAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 41
  },
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2024-09-23T00:56:17.225684Z",
     "start_time": "2024-09-23T00:56:16.940857Z"
    }
   },
   "source": [
    "\n",
    "# ------------------------------------  第六部分 模型评价  --------------------------------------#\n",
    "# 绘制 ROC曲线\n",
    "from sklearn import metrics\n",
    "import matplotlib.pyplot as plt\n",
    "# fpr假正率，tpr召回率，thresholds阈值，pos_label（设置正样本值）默认为None（标签数据为二分类的情况）\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_predict, pos_label=1)\n",
    "roc_auc = metrics.auc(fpr, tpr)  # auc为Roc曲线下的面积\n",
    "plt.plot(fpr, tpr, 'r')  # 绘制ROC曲线\n",
    "axline = np.array([0.,0.2,0.4,0.6,0.8,1.0])  # 斜线参考线坐标\n",
    "plt.plot(axline,axline,'gray',linestyle='--',alpha=0.5)\n",
    "plt.grid(b=True,axis='both',alpha=0.3)  # 显示网格\n",
    "plt.xlim([-0.05, 1.05])  # 设置x轴刻度范围\n",
    "plt.ylim([-0.05, 1.05])  # 设置y轴刻度范围\n",
    "plt.xlabel('FPR')  # x轴是False Positive Rate\n",
    "plt.ylabel('TPR')  # y轴是True Positive Rate\n",
    "plt.title('AUC = %0.2f' % roc_auc)\n",
    "plt.show()\n"
   ],
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "keyword grid_b is not recognized; valid keywords are ['size', 'width', 'color', 'tickdir', 'pad', 'labelsize', 'labelcolor', 'labelfontfamily', 'zorder', 'gridOn', 'tick1On', 'tick2On', 'label1On', 'label2On', 'length', 'direction', 'left', 'bottom', 'right', 'top', 'labelleft', 'labelbottom', 'labelright', 'labeltop', 'labelrotation', 'grid_agg_filter', 'grid_alpha', 'grid_animated', 'grid_antialiased', 'grid_clip_box', 'grid_clip_on', 'grid_clip_path', 'grid_color', 'grid_dash_capstyle', 'grid_dash_joinstyle', 'grid_dashes', 'grid_data', 'grid_drawstyle', 'grid_figure', 'grid_fillstyle', 'grid_gapcolor', 'grid_gid', 'grid_in_layout', 'grid_label', 'grid_linestyle', 'grid_linewidth', 'grid_marker', 'grid_markeredgecolor', 'grid_markeredgewidth', 'grid_markerfacecolor', 'grid_markerfacecoloralt', 'grid_markersize', 'grid_markevery', 'grid_mouseover', 'grid_path_effects', 'grid_picker', 'grid_pickradius', 'grid_rasterized', 'grid_sketch_params', 'grid_snap', 'grid_solid_capstyle', 'grid_solid_joinstyle', 'grid_transform', 'grid_url', 'grid_visible', 'grid_xdata', 'grid_ydata', 'grid_zorder', 'grid_aa', 'grid_c', 'grid_ds', 'grid_ls', 'grid_lw', 'grid_mec', 'grid_mew', 'grid_mfc', 'grid_mfcalt', 'grid_ms']",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mValueError\u001B[0m                                Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[42], line 11\u001B[0m\n\u001B[0;32m      9\u001B[0m axline \u001B[38;5;241m=\u001B[39m np\u001B[38;5;241m.\u001B[39marray([\u001B[38;5;241m0.\u001B[39m,\u001B[38;5;241m0.2\u001B[39m,\u001B[38;5;241m0.4\u001B[39m,\u001B[38;5;241m0.6\u001B[39m,\u001B[38;5;241m0.8\u001B[39m,\u001B[38;5;241m1.0\u001B[39m])  \u001B[38;5;66;03m# 斜线参考线坐标\u001B[39;00m\n\u001B[0;32m     10\u001B[0m plt\u001B[38;5;241m.\u001B[39mplot(axline,axline,\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mgray\u001B[39m\u001B[38;5;124m'\u001B[39m,linestyle\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124m--\u001B[39m\u001B[38;5;124m'\u001B[39m,alpha\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m0.5\u001B[39m)\n\u001B[1;32m---> 11\u001B[0m plt\u001B[38;5;241m.\u001B[39mgrid(b\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m,axis\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mboth\u001B[39m\u001B[38;5;124m'\u001B[39m,alpha\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m0.3\u001B[39m)  \u001B[38;5;66;03m# 显示网格\u001B[39;00m\n\u001B[0;32m     12\u001B[0m plt\u001B[38;5;241m.\u001B[39mxlim([\u001B[38;5;241m-\u001B[39m\u001B[38;5;241m0.05\u001B[39m, \u001B[38;5;241m1.05\u001B[39m])  \u001B[38;5;66;03m# 设置x轴刻度范围\u001B[39;00m\n\u001B[0;32m     13\u001B[0m plt\u001B[38;5;241m.\u001B[39mylim([\u001B[38;5;241m-\u001B[39m\u001B[38;5;241m0.05\u001B[39m, \u001B[38;5;241m1.05\u001B[39m])  \u001B[38;5;66;03m# 设置y轴刻度范围\u001B[39;00m\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\matplotlib\\pyplot.py:3144\u001B[0m, in \u001B[0;36mgrid\u001B[1;34m(visible, which, axis, **kwargs)\u001B[0m\n\u001B[0;32m   3137\u001B[0m \u001B[38;5;129m@_copy_docstring_and_deprecators\u001B[39m(Axes\u001B[38;5;241m.\u001B[39mgrid)\n\u001B[0;32m   3138\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mgrid\u001B[39m(\n\u001B[0;32m   3139\u001B[0m     visible: \u001B[38;5;28mbool\u001B[39m \u001B[38;5;241m|\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m   3142\u001B[0m     \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs,\n\u001B[0;32m   3143\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[1;32m-> 3144\u001B[0m     gca()\u001B[38;5;241m.\u001B[39mgrid(visible\u001B[38;5;241m=\u001B[39mvisible, which\u001B[38;5;241m=\u001B[39mwhich, axis\u001B[38;5;241m=\u001B[39maxis, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\matplotlib\\axes\\_base.py:3196\u001B[0m, in \u001B[0;36m_AxesBase.grid\u001B[1;34m(self, visible, which, axis, **kwargs)\u001B[0m\n\u001B[0;32m   3194\u001B[0m _api\u001B[38;5;241m.\u001B[39mcheck_in_list([\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mx\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124my\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mboth\u001B[39m\u001B[38;5;124m'\u001B[39m], axis\u001B[38;5;241m=\u001B[39maxis)\n\u001B[0;32m   3195\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m axis \u001B[38;5;129;01min\u001B[39;00m [\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mx\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mboth\u001B[39m\u001B[38;5;124m'\u001B[39m]:\n\u001B[1;32m-> 3196\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mxaxis\u001B[38;5;241m.\u001B[39mgrid(visible, which\u001B[38;5;241m=\u001B[39mwhich, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m   3197\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m axis \u001B[38;5;129;01min\u001B[39;00m [\u001B[38;5;124m'\u001B[39m\u001B[38;5;124my\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mboth\u001B[39m\u001B[38;5;124m'\u001B[39m]:\n\u001B[0;32m   3198\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39myaxis\u001B[38;5;241m.\u001B[39mgrid(visible, which\u001B[38;5;241m=\u001B[39mwhich, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\matplotlib\\axis.py:1697\u001B[0m, in \u001B[0;36mAxis.grid\u001B[1;34m(self, visible, which, **kwargs)\u001B[0m\n\u001B[0;32m   1694\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m which \u001B[38;5;129;01min\u001B[39;00m [\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mmajor\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mboth\u001B[39m\u001B[38;5;124m'\u001B[39m]:\n\u001B[0;32m   1695\u001B[0m     gridkw[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mgridOn\u001B[39m\u001B[38;5;124m'\u001B[39m] \u001B[38;5;241m=\u001B[39m (\u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_major_tick_kw[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mgridOn\u001B[39m\u001B[38;5;124m'\u001B[39m]\n\u001B[0;32m   1696\u001B[0m                         \u001B[38;5;28;01mif\u001B[39;00m visible \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;28;01melse\u001B[39;00m visible)\n\u001B[1;32m-> 1697\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mset_tick_params(which\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mmajor\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mgridkw)\n\u001B[0;32m   1698\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mstale \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mTrue\u001B[39;00m\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\matplotlib\\axis.py:958\u001B[0m, in \u001B[0;36mAxis.set_tick_params\u001B[1;34m(self, which, reset, **kwargs)\u001B[0m\n\u001B[0;32m    945\u001B[0m \u001B[38;5;250m\u001B[39m\u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m    946\u001B[0m \u001B[38;5;124;03mSet appearance parameters for ticks, ticklabels, and gridlines.\u001B[39;00m\n\u001B[0;32m    947\u001B[0m \n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    955\u001B[0m \u001B[38;5;124;03m    gridlines.\u001B[39;00m\n\u001B[0;32m    956\u001B[0m \u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m    957\u001B[0m _api\u001B[38;5;241m.\u001B[39mcheck_in_list([\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mmajor\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mminor\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mboth\u001B[39m\u001B[38;5;124m'\u001B[39m], which\u001B[38;5;241m=\u001B[39mwhich)\n\u001B[1;32m--> 958\u001B[0m kwtrans \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_translate_tick_params(kwargs)\n\u001B[0;32m    960\u001B[0m \u001B[38;5;66;03m# the kwargs are stored in self._major/minor_tick_kw so that any\u001B[39;00m\n\u001B[0;32m    961\u001B[0m \u001B[38;5;66;03m# future new ticks will automatically get them\u001B[39;00m\n\u001B[0;32m    962\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m reset:\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\matplotlib\\axis.py:1102\u001B[0m, in \u001B[0;36mAxis._translate_tick_params\u001B[1;34m(kw, reverse)\u001B[0m\n\u001B[0;32m   1100\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m key \u001B[38;5;129;01min\u001B[39;00m kw_:\n\u001B[0;32m   1101\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m key \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;129;01min\u001B[39;00m allowed_keys:\n\u001B[1;32m-> 1102\u001B[0m         \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\n\u001B[0;32m   1103\u001B[0m             \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mkeyword \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m is not recognized; valid keywords are \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m   1104\u001B[0m             \u001B[38;5;241m%\u001B[39m (key, allowed_keys))\n\u001B[0;32m   1105\u001B[0m kwtrans\u001B[38;5;241m.\u001B[39mupdate(kw_)\n\u001B[0;32m   1106\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m kwtrans\n",
      "\u001B[1;31mValueError\u001B[0m: keyword grid_b is not recognized; valid keywords are ['size', 'width', 'color', 'tickdir', 'pad', 'labelsize', 'labelcolor', 'labelfontfamily', 'zorder', 'gridOn', 'tick1On', 'tick2On', 'label1On', 'label2On', 'length', 'direction', 'left', 'bottom', 'right', 'top', 'labelleft', 'labelbottom', 'labelright', 'labeltop', 'labelrotation', 'grid_agg_filter', 'grid_alpha', 'grid_animated', 'grid_antialiased', 'grid_clip_box', 'grid_clip_on', 'grid_clip_path', 'grid_color', 'grid_dash_capstyle', 'grid_dash_joinstyle', 'grid_dashes', 'grid_data', 'grid_drawstyle', 'grid_figure', 'grid_fillstyle', 'grid_gapcolor', 'grid_gid', 'grid_in_layout', 'grid_label', 'grid_linestyle', 'grid_linewidth', 'grid_marker', 'grid_markeredgecolor', 'grid_markeredgewidth', 'grid_markerfacecolor', 'grid_markerfacecoloralt', 'grid_markersize', 'grid_markevery', 'grid_mouseover', 'grid_path_effects', 'grid_picker', 'grid_pickradius', 'grid_rasterized', 'grid_sketch_params', 'grid_snap', 'grid_solid_capstyle', 'grid_solid_joinstyle', 'grid_transform', 'grid_url', 'grid_visible', 'grid_xdata', 'grid_ydata', 'grid_zorder', 'grid_aa', 'grid_c', 'grid_ds', 'grid_ls', 'grid_lw', 'grid_mec', 'grid_mew', 'grid_mfc', 'grid_mfcalt', 'grid_ms']"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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mmuuYefOnWzfvh2fz8cDDzzAqlWrpqx4ERERiW9hBxGn08mGDRu46667qK+v56mnnuKOO+4AYO3atbzwwgtn7JOXl8dXvvIV/v7v/55Vq1axZ88ebr/99qmrXkREROLahHpprl69mqeffpqGhgbq6urIy8sD4LnnnjvnPh/96EdZtWoVbW1trFixgqysrIurWERERBLGhIeLFBYWTrifR3FxMcXFxRP9ViIiIpLgkvemdyIiImI5BRERERGxjIKIiIiIWEZBRERERCyjICIiIiKWURARERERyyiIiIiIiGUURERERMQyE57QLNoMwwDM2wlPpeDxpvq4cjq1c/SoraND7RwdaufoiGQ7B48Z/Bw/F5txoVdYzOPx0NDQYHUZIiIiMgm1tbWkpqae8+sxH0QCgQA+nw+73Y7NZrO6HBEREQmDYRgEAgGcTid2+7l7gsR8EBEREZHEpc6qIiIiYhkFEREREbGMgoiIiIhYRkFERERELKMgIiIiIpZREBERERHLKIiIiIiIZRRERERExDIJG0RaW1u56aabWL58ORs3brzgXPcAr7zyCmvWrOGKK65g06ZNUagy/k2mnTdv3syqVauoqanh1ltvpaurKwqVxr/JtHWQ1+vlfe97Hy+//HIEK0wMF9POX/rSl9iwYUMEq0sck2nn+++/n/r6eurq6vj85z9PX19fFCqNf319fVxzzTV0dHSE9fpofxYmZBDxeDysW7eOmpoatm7dSltbG4888sh59+nt7eX222/n+uuvZ/PmzTz22GNs3749ShXHp8m0844dO/jRj37EPffcw7PPPsvY2BgbN26MUsXxazJtfar777+f1tbWCFaYGC6mnV966SW2b9/OF77whQhXGf8m086vvvoq27Zt46GHHuIPf/iDfneEqbe3l3Xr1nH48OGwXx/1z0IjAT3zzDPG8uXLjZGREcMwDKOpqcn40Ic+dN59Nm3aZLz73e82AoFA6Bh33HFHxGuNZ5Np54cffth46qmnQttbtmwx3vWud0W0zkQwmbYOam9vNy6//HLj6quvNrZv3x7JMuPeZNt5dHTUuPbaa43f//73kS4xIUymne+//35j48aNoe1t27YZH/zgByNaZyK45ZZbjF/+8pdGeXm5cejQoQu+3orPwoQ8I9Lc3Mwll1xCRkYGABUVFbS1tZ13n5aWFlauXBm6sd7SpUtxuVwRrzWeTaadb775Zt71rneFttvb2ykuLo5onYlgMm0d9I1vfIPbbruNuXPnRrLEhDDZdv7Zz36G2+3G6XTy17/+dUKXc5LRZNq5rKyMZ555hoMHD9LT08OWLVuor6+PRrlxbcOGDdxyyy1hv96Kz8KEDCJDQ0PMmzcvtG2z2bDb7fT394e9T1ZWFseOHYtonfFuMu18qr6+PjZv3sxHPvKRSJWYMCbb1lu3bmVoaIhbb7010iUmhMm085EjR9i0aRPFxcUcOXKE733ve3zuc59TGDmPybTzO97xDoqLi7nuuuuor69ndHSUT3/609EoN67Nnz9/Qq+34rMwIYOIw+EgNTX1tOfS0tJwu91h73Oh18vk2vlU3/rWt1i2bBlXXXVVBKpLLJNp697eXu69917uvvtunE5npEtMCJNp50ceeYSZM2eyadMmPvOZz/Dggw/y6quv8r//+7+RLjduTaad//SnP3HkyBGefPJJXn75ZcrKyvjyl78c6VKTjhWfhQkZRHJycujt7T3tueHhYVJSUsLe50Kvl8m1c9CWLVvYsWMH3/3udyNVXkKZTFvffffdfOADH6CqqirS5SWMybTzsWPHWLlyZeiXd1ZWFsXFxWGPUEhGk2nnJ554gg9/+MMsXryYGTNm8LWvfY2nn36agYGBSJebVKz4LEzIIFJbW8uuXbtC2x0dHXg8HnJycsLep6mpicLCwojWGe8m084Au3fv5rvf/S733nsvM2fOjHSZCWEybf3444/z61//mssvv5zLL7+cnTt3sm7dOu67775olByXJtPORUVFjI2NhbYDgQCdnZ3MmTMnorXGs8m0s9/v5/jx46Ht4LB/v98fuUKTkBWfhQkZRJYvX87g4CDbtm0D4L777qO+vh6Hw8HQ0BBer/eMfa655hp27tzJ9u3b8fl8PPDAA6xatSrKlceXybTz8ePHWbduHbfddhs1NTUMDw8zPDwc5crjz2Ta+tlnn+XRRx9l27ZtbNu2jSVLlvCd73yHD33oQ1GuPn5Mpp3XrFnD888/z1NPPUVnZyff//738Xg81NXVRbn6+DGZdq6rq+Phhx/mt7/9LX/4wx9Yv349y5YtIzc3N8rVJ4aY+iyM6JgcCz3zzDPG0qVLjbe97W3GihUrjNbWVsMwDOPqq682nnnmmbPu89BDDxk1NTXGFVdcYVx99dVGd3d3NEuOSxNt502bNhnl5eVnPOTCJvOePtXHPvYxDd8Nw2Ta+fnnnzfe//73G7W1tcb1119v7NixI5olx6WJtrPb7TY2bNhgrFq1yqipqTE+9rGPGQcOHIh22XHrrcN3Y+mz0GYYidu1+9ixYzQ0NFBXV0deXl5Y+xw4cIC2tjZWrFhBVlZWhCtMDJNpZ5kctXV0qJ2jQ+0cu6L5WZjQQURERERiW0L2EREREZH4oCAiIiIillEQEREREcsoiIiIiIhlFERERETEMgoiIiIiYhkFEREREbGMgoiIiIhYRkFERERELPP/A47w+ZXfpgnvAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 42
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-23T13:10:41.996766Z",
     "start_time": "2024-09-23T13:10:41.940615Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# ------------------------------------  第七部分 模型应用  --------------------------------------#\n",
    "# 预测给定的测试集\n",
    "pre_test = new_test_data[features]\n",
    "result = GBC_model.predict_proba(pre_test)[:,1]\n",
    "test_result = new_test_data[['User_id','Coupon_id','Date_received']]\n",
    "test_result['Probability'] = result\n",
    "# 查看描述性结果\n",
    "test_result['Probability'].describe()\n",
    "test_result.to_csv('./new_sample_submission.csv',index=None,header=None)"
   ],
   "id": "343cfe3865c59f55",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "        Dis_rate  Discount_type  Discount_man  Discount_jian  Distance  \\\n",
       "0       0.833333              1            30              5         1   \n",
       "1       0.833333              1            30              5         0   \n",
       "2       0.833333              1            30              5         0   \n",
       "3       0.833333              1            30              5        10   \n",
       "4       0.833333              1            30              5         3   \n",
       "...          ...            ...           ...            ...       ...   \n",
       "113635  0.800000              1           100             20        10   \n",
       "113636  0.900000              0             0              0         6   \n",
       "113637  0.900000              1            50              5         5   \n",
       "113638  0.950000              0             0              0         0   \n",
       "113639  0.950000              1            20              1         0   \n",
       "\n",
       "        Distance_type  Distance-1  Distance0  Distance1  Distance2  ...  \\\n",
       "0                   0           0          0          1          0  ...   \n",
       "1                   0           0          1          0          0  ...   \n",
       "2                   0           0          1          0          0  ...   \n",
       "3                   3           0          0          0          0  ...   \n",
       "4                   1           0          0          0          0  ...   \n",
       "...               ...         ...        ...        ...        ...  ...   \n",
       "113635              3           0          0          0          0  ...   \n",
       "113636              2           0          0          0          0  ...   \n",
       "113637              1           0          0          0          0  ...   \n",
       "113638              0           0          1          0          0  ...   \n",
       "113639              0           0          1          0          0  ...   \n",
       "\n",
       "        merchant_median_distance  Is_weekend  Weekday  weekday1  weekday2  \\\n",
       "0                            2.0           0        2         0         1   \n",
       "1                            2.0           0        3         0         0   \n",
       "2                            2.0           1        6         0         0   \n",
       "3                            2.0           0        5         0         0   \n",
       "4                            2.0           1        6         0         0   \n",
       "...                          ...         ...      ...       ...       ...   \n",
       "113635                      10.0           0        5         0         0   \n",
       "113636                       6.0           1        6         0         0   \n",
       "113637                       5.0           1        7         0         0   \n",
       "113638                       0.0           0        2         0         1   \n",
       "113639                       0.0           0        3         0         0   \n",
       "\n",
       "        weekday3  weekday4  weekday5  weekday6  weekday7  \n",
       "0              0         0         0         0         0  \n",
       "1              1         0         0         0         0  \n",
       "2              0         0         0         1         0  \n",
       "3              0         0         1         0         0  \n",
       "4              0         0         0         1         0  \n",
       "...          ...       ...       ...       ...       ...  \n",
       "113635         0         0         1         0         0  \n",
       "113636         0         0         0         1         0  \n",
       "113637         0         0         0         0         1  \n",
       "113638         0         0         0         0         0  \n",
       "113639         1         0         0         0         0  \n",
       "\n",
       "[113640 rows x 34 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dis_rate</th>\n",
       "      <th>Discount_type</th>\n",
       "      <th>Discount_man</th>\n",
       "      <th>Discount_jian</th>\n",
       "      <th>Distance</th>\n",
       "      <th>Distance_type</th>\n",
       "      <th>Distance-1</th>\n",
       "      <th>Distance0</th>\n",
       "      <th>Distance1</th>\n",
       "      <th>Distance2</th>\n",
       "      <th>...</th>\n",
       "      <th>merchant_median_distance</th>\n",
       "      <th>Is_weekend</th>\n",
       "      <th>Weekday</th>\n",
       "      <th>weekday1</th>\n",
       "      <th>weekday2</th>\n",
       "      <th>weekday3</th>\n",
       "      <th>weekday4</th>\n",
       "      <th>weekday5</th>\n",
       "      <th>weekday6</th>\n",
       "      <th>weekday7</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>10</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113635</th>\n",
       "      <td>0.800000</td>\n",
       "      <td>1</td>\n",
       "      <td>100</td>\n",
       "      <td>20</td>\n",
       "      <td>10</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>10.0</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113636</th>\n",
       "      <td>0.900000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>6.0</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113637</th>\n",
       "      <td>0.900000</td>\n",
       "      <td>1</td>\n",
       "      <td>50</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>5.0</td>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113638</th>\n",
       "      <td>0.950000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113639</th>\n",
       "      <td>0.950000</td>\n",
       "      <td>1</td>\n",
       "      <td>20</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>113640 rows × 34 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 93
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
